Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 6/7/8 » падают юнит тесты » 27.07.2021 09:27:22

если ставлю

 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

что конкретно в коде надо именить и что оно вообще просит?

#2 Laravel 6/7/8 » падают юнит тесты » 26.07.2021 17:02:49

grafillo
Ответов: 2

Падает юнит тест когда вывожу ошибку 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, как это решается и в чём проблема?

#3 Laravel 6/7/8 » Как получить ошибки валидации в JSON » 07.07.2021 17:17:59

grafillo
Ответов: 1

У меня есть регистрация в которой валидатор проверяет поля

$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)

как вывести нормально ошибку валдиации чере аякс подскажите пожалуйста?

#4 Laravel 6/7/8 » Как сделать очередь сидов » 16.06.2021 10:46:44

grafillo
Ответов: 1

Есть файлы сидов, когда я делаю мигрэйт рефреш они запускаются в не том порядке котором надо и всё ломается, как выстроить порядок сидов?

#5 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 10.06.2021 20:11:30

Понял, спасибо , там в проект подключили ещё одного чела он нашёл баг, там тенанты в свою кодировку перекодируют языковые файлы в кеше которые вызывает валидация при ошибке, поэтому происходит ошибка, пока он нашёл только один вариант решения это выпилить языковые файлы)

#6 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 09.06.2021 22:38:44

шта? х)
пишу русским по белому, если убираю роут из под тенатнов
вот так выглядит роут под тенантами

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');

});

вот тот роут котоырй без тенантов работает нормально и валидация не выдаёт ошибок вот тот который под тенантами выдаёт вот эту ошибку unknown.png?width=1020&height=413если валидация находит ошибку, в чём фантазия сударь? в том что валидация из под тенантов не пашет?

#7 Re: Laravel 6/7/8 » Не работает стандартная защита BREEEZE от множественного запроса » 08.06.2021 13:33:08

Все проверенно, hit работает,  RateLimiter почемуто не запоминает число попыток, это скорее всего из-за кеша который я поставил CACHE_DRIVER=array ибо с другим драйвером не работают тенанты  из другого моего поста.

#8 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 08.06.2021 13:28:33

Потомучто когда валидация не проходит
$request->validate([
            'phone' => 'required|string|max:255|exists:users,phone',
        ]);
то выскакивает эта ошибка:This cache store does not support tagging.
Если валидация не определяет ошибок то ничего не выскакивает. Если я убираю роут из под тенантов   https://tenancyforlaravel.com/ , то всё также работает нормально и при валидации формы на экран вью выдаёт сообщение почему не прошла валидации. Если вставляю обратно под тенанты, то, если валидация не проходит, на экран выскакивает ошибкаunknown.png?width=1020&height=413

#9 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 07.06.2021 19:27:59

и как надо прописать валидацию чтобы она использовала раздельный кеш?
там и без xdebug видно что вызывается класс кэша из тенантов который вызывает ошибку.

#10 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 04.06.2021 10:15:32

причина найдена, но не устранена ктонить работал с тенантами https://tenancyforlaravel.com/ они почемуто вызывают свой кэш при валидации. Ктонить знает как это устранить?

#11 Re: Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 03.06.2021 20:37:21

точнее не работает валидация  ни правила ни валидация а функция 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.

#12 Laravel 6/7/8 » Опять магическая ошибка от ларавел:This cache store does not support » 03.06.2021 18:18:51

grafillo
Ответов: 12

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

Ктото может помочь разобраться в очередной магии ларавел?

#13 Re: Laravel 6/7/8 » Как собрать все ошибки в одном месте » 03.06.2021 15:50:58

вы немного путаете объекты 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 ) ) )

#14 Re: Laravel 6/7/8 » Как собрать все ошибки в одном месте » 03.06.2021 13:52:41

получается что функция withErrors не функциональна и для неё отдельно в представление нужно код добавлять?

#15 Laravel 6/7/8 » Как собрать все ошибки в одном месте » 03.06.2021 12:00:15

grafillo
Ответов: 4

У меня есть валидатор и функция которая возвращает ответ либо с ошибкой либо нет, и чтобы получить эти два ответа приходится во вью писать два разных кода, возможно ли собрать все ошибки в одном месте? Пробовал и 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

#16 Re: Laravel 6/7/8 » Не работает стандартная защита BREEEZE от множественного запроса » 03.06.2021 10:10:53

Разобрался в чём проблема, но не понял как устранить ,
RateLimiter::attempts($this->throttleKey());  - почему-то не запоминает количество попыток и всегда выводит 1, почему так происходит?

#17 Laravel 6/7/8 » Не работает стандартная защита BREEEZE от множественного запроса » 02.06.2021 18:17:38

grafillo
Ответов: 3

Не работает стандартная защита авторизации бриз от множественного запроса 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();
    }
}

#18 Re: Laravel 6/7/8 » ларваел обращается к роутам которых нет и выводит адреса которых нет » 28.05.2021 14:07:04

вопрос решился, я ещё установил fortify и хотя её не использовал файлы ядра каким-то образом перенаправляли файлы breeze, кароч мутная шняга эта ларавел, не используешь код одного так он переделывает код другого причём из ядра както и это даже не увидеть, а гит вообще мне говорил что эти файлы вне проекта х)
как это работает до конца не понятно, а можно ли просмотреть все установленные дополнения в ларавел?

#19 Laravel 6/7/8 » ларваел обращается к роутам которых нет и выводит адреса которых нет » 28.05.2021 10:41:23

grafillo
Ответов: 2

Кароче магия происходит, установлены в ларавел тенанты и вручную перенесена авторизация 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, то есть откуда вообще выполняется код? такое ощущение, что он вообще не с проекта берётся

#20 Re: Laravel 6/7/8 » Мидлвере ссылается на несуществующий роут » 28.05.2021 08:40:00

в проекте нету такого роута кроме как в  Handler.php, что  это за файл?
непарную кавычку исправил, а что такое xdebug?

#21 Laravel 6/7/8 » Мидлвере ссылается на несуществующий роут » 27.05.2021 14:54:20

grafillo
Ответов: 3

Установил brezee аутентификацию, так как сложная структура сайта переименовал роуты

Route::get('/login', 'Auth\AuthenticatedSessionController@create')->name('shop.auth.login');
 Route::get('/verify-email', 'Auth\EmailVerificationPromptController@__invoke')->middleware('auth')
        ->name('shop.auth.verification.notice');

когда идёт обращение на адрес '/verify-email' то выдаётся ошибка Route [login] not defined. В файле Middleware\Authenticate.php прописал:

protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return Route(shop.auth.login');
        }
    }

Всё равно это не помогло, причём кто обращается к этому роуту в окне ошибки не показано. В чём может быть проблема и как узнать кто обращается к этому роуту?

#22 Re: Laravel 6/7/8 » Почему не ансетится сессион? » 25.05.2021 13:23:31

всё разобрался, функция dd мешает работе сессий, если её убрать всё отлично работает.

#23 Laravel 6/7/8 » Почему не ансетится сессион? » 24.05.2021 20:20:53

grafillo
Ответов: 2

есть две функции в классе, если запускаю роут который ведёт на функцию delCart то потом когда запускаю роут с функцией index массив сешн удаляется, то есть cart=[] пустой массив, если запускаю роут который запускает функцию addToCart то он обновляет массив только в окне где был запущен этот роут, в другом окне где открыт роут index массив не удаляется, что это за магия такая? две одинаковые функции одна работает другая нет.

public function index(){

        dd(session()->all());
        return view('shops.'.tenant('template').'.cart');
    }

    public function addToCart(Request $req, $id, $quantity){

//        if($req->session()->missing('cart')){
//            $cart = [];
//            $req -> session()->put('cart',$cart);
//        }
//
//       // dd(session()->all());
//
//        $cart_array = session()->get('cart');
//        foreach($cart_array as $key => $cart){
//            if($cart['id']==$id){
//
//              //  $product = $req -> session()->forget('cart.'.$key);
//
//              $cart_array[$key]['quantity'] += $quantity;
//              //$req ->session()->forget('cart');
//              //$req ->session()->put('cart',$cart_array);
//
//              //return ;
//            }
//        }

        $cart = [];
        $req -> session()->put('cart',$cart);
        //$req ->session()->put('cart',$cart_array);
        //dd($cart_array);
        dd(session()->all());
//
        $offers = Offer::with('product','feature')->where('id',$id)->first();

        if(empty($offers->id)){
            return response()->json(['result'=>'unsuccess','text'=>'Нет такого товара']);
        }

        //dd($offers->retail_price);
        $cart = ['id'=>$id,'quantity'=>$quantity,'name'=>$offers->product->name,'article'=>$offers->product->code_1c,'price'=>$offers->retail_price];
        $req ->session()->push('cart',$cart);
        $arr = session()->get('cart');
        $quantity= 0;
        foreach($arr as $quant){ $quantity += $quant['quantity']; }
        $summ_cart = 0;
        foreach($arr as $summ){ $summ_cart += $summ['price']*$summ['quantity']; }

        return response()->json(['result'=>'success','cart'=>$cart,'quantity'=>$quantity,'summ_cart'=>$summ_cart]);
        //return response()->json(['result'=>'success','text'=>'товар  добавлен в сравнение','quantity_product'=>count($arr)]);


    }

    public function delCart(Request $req){

        $cart = [];
        $req -> session()->put('cart',$cart);

    }

Подвал раздела