Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Есть ли в ларавеле связь которая может связать три таблицы через многие ко многим, суть запроса такова
есть модели: тэги, статьи, авторы, как через тэги связь многие ко многим к статьям получить ещё и авторов ко всем статьям? То есть через тег получить все статьи содержащие этот тэг с авторами?
Есть таблицы group и user связанные многие ко многим, как в пивот таблице уникализировать пару значений? то есть в таблице group_user нужно чтобы строка значений user_id и group_id могла быть только одна с данной группой и данным юзером, то есть
если есть значение user_id = 1 group_id = 1 нельзя было вставить строку с такими значениями.
уже разобрался
Установил авторизацию laravel breeze и она почемуто не отсылает почту, у меня установлен опен сервер
если пользуюсь функцией mail(); - то всё работает, отправленные письма сохраняются в папке опен сервера, а если прохожу регистрацию то написано что письмо отправлено но его нет ни в папке ни в клиенте, даже если ставлю в .env MAIL_MAILER=log в логах ничего не сохраняется, подскажите что делать как исправить отправку почты laravel breeze
Необходимо идентифицировать человека и его настройки которые он выбрал чтобы в следующем заходе на сайт они были такие же, как это сделать с помощью куков?
пишу код куков, если ставлю параметру age значение 1 то всё равно при обращении к этой переменной в куках она пустая, как это работает в ларавеле?
cookie('age',1);
dd(cookie('age'));
если ставлю
public function boot()
{
$this->bootEvents();
$this->mapRoutes();
\Stancl\Tenancy\Middleware\InitializeTenancyByDomain::$onFail = function () {
abort(404);
};
$this->makeTenancyMiddlewareHighestPriority();
}
abort(404); то возникает ошибка юнит тестов
1) Tests\Feature\ExampleTest::testBasicTest
Expected status code 200 but received 404.
Failed asserting that 200 is identical to 404
что конкретно в коде надо именить и что оно вообще просит?
Падает юнит тест когда вывожу ошибку 404
public function boot()
{
$this->bootEvents();
$this->mapRoutes();
\Stancl\Tenancy\Middleware\InitializeTenancyByDomain::$onFail = function () {
//abort(404);
return response()->view('404');
};
$this->makeTenancyMiddlewareHighestPriority();
}
есть установленные тенанты, если тенанта не существует то должно выводится ошибка 404, любым способом вывожду ошибку 404 но падают юнит тесты они отвечают
1) Tests\Feature\ExampleTest::testBasicTest
Expected status code 200 but received 500.
Failed asserting that 200 is identical to 500.
он типа ожидает 200 ответ но получает ошибку 500, как это решается и в чём проблема?
У меня есть регистрация в которой валидатор проверяет поля
$request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|confirmed|min:8',
'phone' => 'required|unique:users'
]);
я обращаюсь в функцию регистрации через аякс запрос, как получить ответы в форме JSON? Сейчас когдая ловлю ошибку
axios.post(`/generatesms`, {phone: phone})
.then(response => {
if (response.data.success == 'true') {
document.querySelector('#enterPhone').innerHTML = phone;
navigationEnterMenu(target); //успех
next_sms_time = response.data.data.timer;
enterTimer();
}else{
document.querySelector('#madalEnterPhone').classList.remove('js-modal-enter-content-open');
document.querySelector('.modal-enter-form-phone-text').innerHTML = phone + '<br>Не зарегистрирован!';
document.querySelector('#errorEnter').classList.add('js-modal-enter-content-open');
}
}).catch(err => {
console.log(err);
});
в catch(err) если валидация не пройдена выходит вот это
Error: Request failed with status code 422
at createError (app.js?v1.00:607)
at settle (app.js?v1.00:878)
at XMLHttpRequest.handleLoad (app.js?v1.00:82)
как вывести нормально ошибку валдиации чере аякс подскажите пожалуйста?
Есть файлы сидов, когда я делаю мигрэйт рефреш они запускаются в не том порядке котором надо и всё ломается, как выстроить порядок сидов?
Понял, спасибо , там в проект подключили ещё одного чела он нашёл баг, там тенанты в свою кодировку перекодируют языковые файлы в кеше которые вызывает валидация при ошибке, поэтому происходит ошибка, пока он нашёл только один вариант решения это выпилить языковые файлы)
шта? х)
пишу русским по белому, если убираю роут из под тенатнов
вот так выглядит роут под тенантами
Route::middleware([
'web',
InitializeTenancyByDomain::class,
])->namespace("Auth")->group(function () {
Route::get('/registration', 'RegisteredUserController@create')->name('shop.auth.register');
});
вот так выглядит роут без тенантов
Route::middleware([
'web',
])->namespace("Auth")->group(function () {
Route::get('/registration', 'RegisteredUserController@create')->name('shop.auth.register');
});
вот тот роут котоырй без тенантов работает нормально и валидация не выдаёт ошибок вот тот который под тенантами выдаёт вот эту ошибку если валидация находит ошибку, в чём фантазия сударь? в том что валидация из под тенантов не пашет?
Все проверенно, hit работает, RateLimiter почемуто не запоминает число попыток, это скорее всего из-за кеша который я поставил CACHE_DRIVER=array ибо с другим драйвером не работают тенанты из другого моего поста.
Потомучто когда валидация не проходит
$request->validate([
'phone' => 'required|string|max:255|exists:users,phone',
]);
то выскакивает эта ошибка:This cache store does not support tagging.
Если валидация не определяет ошибок то ничего не выскакивает. Если я убираю роут из под тенантов https://tenancyforlaravel.com/ , то всё также работает нормально и при валидации формы на экран вью выдаёт сообщение почему не прошла валидации. Если вставляю обратно под тенанты, то, если валидация не проходит, на экран выскакивает ошибка
и как надо прописать валидацию чтобы она использовала раздельный кеш?
там и без xdebug видно что вызывается класс кэша из тенантов который вызывает ошибку.
причина найдена, но не устранена ктонить работал с тенантами https://tenancyforlaravel.com/ они почемуто вызывают свой кэш при валидации. Ктонить знает как это устранить?
точнее не работает валидация ни правила ни валидация а функция with работает
$request->validate([
'phone' => 'required|string|max:255|exists:users,phone',
]);
public function rules()
{
return [
'smscode' => 'required',
'phone' => 'required'
];
}
то есть когда запрос не проходит валидацию выскакивает ошибка This cache store does not support tagging.
This cache store does not support tagging. Есть два проекта, на одном всё работает, на другом выскакивает ошибка при использовании функции with('status', $status); В обоих проектах кэш указан идентично
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
Ктото может помочь разобраться в очередной магии ларавел?
вы немного путаете объекты withErrors и Validator идентичны они отличаются очень незначительно,
объект withErrors:
Illuminate\Support\ViewErrorBag Object ( [bags:protected] => Array ( [errors] => Illuminate\Support\MessageBag Object ( [messages:protected] =>
Array ( [0] => Array ( [0] => В базе нет такого телефона! ) ) [format:protected] => :message ) ) )
и объект валидатора
Illuminate\Support\ViewErrorBag Object ( [bags:protected] => Array ( [default] => Illuminate\Support\MessageBag Object ( [messages:protected] => Array ( [smscode] => Array ( [0] => The smscode field is required. ) [phone] => Array ( [0] => The phone field is required. ) )
[format:protected] => :message ) ) )
получается что функция withErrors не функциональна и для неё отдельно в представление нужно код добавлять?
У меня есть валидатор и функция которая возвращает ответ либо с ошибкой либо нет, и чтобы получить эти два ответа приходится во вью писать два разных кода, возможно ли собрать все ошибки в одном месте? Пробовал и withErrors(,); и просто with("errors",'В базе нет такого телефона!') и всё равно разный доступ к ним.
public function generateSms(Request $request)
{
$request->validate([
'phone' => 'required|string|max:255',
]);
$smscode = 12345;
$phone = $request->phone;
$user = User::where('phone',$phone)->update(['smscode' => $smscode]);
if(!$user){
return redirect()->route('phonelogin')->withErrors('В базе нет такого телефона!',"errors");
}
return redirect()->route('phonelogin')->with('success',"Вам отправлено смс с кодом!");
}
доступ во вью
{{ $errors->errors->first() }}
@if ($errors->any())
<div class="">
<ul>
@foreach($errors->all() as $error)
<li>
{{$error}}
</li>
@endforeach
</ul>
</div>
@endif
Разобрался в чём проблема, но не понял как устранить ,
RateLimiter::attempts($this->throttleKey()); - почему-то не запоминает количество попыток и всегда выводит 1, почему так происходит?
Не работает стандартная защита авторизации бриз от множественного запроса RateLimiter, я пробовал ставить
RateLimiter::tooManyAttempts($this->throttleKey(), 5) вместо 5 1 и ничего не работает, RateLimiter::tooManyAttempts($this->throttleKey(), 5)) всегда возвращает false, что делать кто знает?
public function authenticate()
{
$this->ensureIsNotRateLimited();
if (!Auth::check()) {
RateLimiter::hit($this->throttleKey());
throw ValidationException::withMessages([
'phone' => __('auth.failed'),
]);
}
RateLimiter::clear($this->throttleKey());
}
/**
* Ensure the login request is not rate limited.
*
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
public function ensureIsNotRateLimited()
{
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
return;
}
event(new Lockout($this));
$seconds = RateLimiter::availableIn($this->throttleKey());
throw ValidationException::withMessages([
'phone' => trans('auth.throttle', [
'seconds' => $seconds,
'minutes' => ceil($seconds / 60),
]),
]);
}
/**
* Get the rate limiting throttle key for the request.
*
* @return string
*/
public function throttleKey()
{
return Str::lower($this->input('phone')).'|'.$this->ip();
}
}
вопрос решился, я ещё установил fortify и хотя её не использовал файлы ядра каким-то образом перенаправляли файлы breeze, кароч мутная шняга эта ларавел, не используешь код одного так он переделывает код другого причём из ядра както и это даже не увидеть, а гит вообще мне говорил что эти файлы вне проекта х)
как это работает до конца не понятно, а можно ли просмотреть все установленные дополнения в ларавел?
Кароче магия происходит, установлены в ларавел тенанты и вручную перенесена авторизация breeze. После регистрации автоматически создаётся письмо подтверждения http://site1.localhost:8000/email/verif … 881246d065
но у меня нет email/verify/ такого роута в списке! Есть вот такой /verify-email/{id}/{hash}. После клика по ссылке происходит код который переадресовывает на
return redirect()->intended(RouteServiceProvider::HOME.'?verified=1');
и этот код запускается через роут /verify-email/{id}/{hash} , при том что в RouteServiceProvider прописано
public const HOME = '/';
но он редиректит на http://site1.localhost:8000/home?verified=1 какбудто нет этой ссылки HOME, притом что ставлю функцию dd перед return redirect()->intended(RouteServiceProvider::HOME.'?verified=1 и dd не cрабатывает! Что это б... за магия происходит? Как это вообще работает? в проекте только две строчки с такой ?verified=1 ссылкой и на обеих не работает функция dd, то есть откуда вообще выполняется код? такое ощущение, что он вообще не с проекта берётся
в проекте нету такого роута кроме как в Handler.php, что это за файл?
непарную кавычку исправил, а что такое xdebug?