промежуточное ПО конфликтует с контроллером __construct промежуточное ПО (ошибка проверки запроса не работает) - PullRequest
0 голосов
/ 25 января 2020

Я использую промежуточное ПО для пользовательских ролей. Но когда я использую промежуточное ПО в методе Controller __construct, проверка запросов не работает должным образом. Он не показывает никаких ошибок, сессия мешок ошибок возвращает ноль. Я не вижу никаких ошибок при отправке формы. Но когда я отключил промежуточное ПО в конструкции, я вижу ошибки проверки запроса.

web. php middleware + controller _construct middleware = проверка запроса не работает.

web. php middleware + без _construct middleware = отлично работает.

без web. php middleware + _construct middleware = отлично работает.

Я показал подробности в мои коды.

Я пробовал каждый метод в течение недели, но я не мог решить его. Я с нетерпением жду вашей помощи.

web. php

Route::group(['middleware' => ['client.role:paying']], function () {
    Route::get('/pay_section', 'HomepageController@showPaySection');
    Route::get('/pay_success', 'HomepageController@showPaySuccess');
    Route::get('/pay_error', 'HomepageController@showPayError');
    Route::post('/pay_section', 'HomepageController@doPaySection');
});

HomepageController (как этот мой запрос проверки формы не работает из-за промежуточного программного обеспечения)

public function __construct()
{
$this->middleware(function ($request, $next) {

    $client = auth()->guard('client');
    if ($client->check()){
        $request->session()->put('client_id', $client->user()->id);
    }else{
        $request->session()->put('client_id', -1);
    }

    $this->_cid = $request->session()->get('client_id'); // client
    View::share(['cid' => $this->_cid]);
    return $next($request);
});
}

HomepageController (вот так мои коды работают отлично. Я вижу ошибки проверки запросов, проблем нет.)

public function __construct()
{

   $this->_cid = 2; // client
   View::share(['cid' => $this->_cid]);
}

Middleware ClientRole. php

public function handle($request, Closure $next, ...$roles)
{


    $currentRole = array();
    $client = auth()->guard('client');


    if ($client->check()){
        $currentRole[] = 'client';
    }else{
        $currentRole[] = 'guest';
    }

    if (session()->has('shop_cart')) {
        $currentRole[] = 'shopping';
    }

    if (session()->has('order')) {
        $currentRole[] = 'paying';
    }

    $currentRole[] = 'paying';
    foreach($roles as $role) {
        if(in_array($role, $currentRole))
            return $next($request);
    }

    return redirect('/');

}

Форма HomepageController действие

public function doPaySection(CreditcardRequest $request)
{

    $validated = $request->validated();

    // it doesnt show any errors when form empty. But it should be.
    // without middleware it shows error on my view when form empty. 

}

Просмотр

     <div class="messages">
            @if ($errors->any())
                <div class="row  mt-3">
                    <div class="col-md-12">
                        <div class="alert alert-warning alert-dismissable" role="alert">
                            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                                <span aria-hidden="true">&times;</span>
                            </button>
                            <h3 class="alert-heading font-size-h4 font-w400">Error!</h3>
                            @foreach ($errors->all() as $error)
                                <p class="mb-0">{{ $error }}</p>
                            @endforeach
                        </div>
                    </div>
                </div>
            @endif
        </div>



        <form action="{{ action('HomepageController@doPaySection') }}" method="post"
              class="needs-validation" novalidate>

            @csrf


            <div class="row">
                <div class="col-md-6 mb-3">
                    <label for="ccname">Name on card</label>
                    <input type="text" class="form-control" name="cc_name" id="ccname" placeholder=""  value="" required>
                    <small class="text-muted">Full name as displayed on card</small>
                    <div class="invalid-feedback">
                        Name on card is required
                    </div>
                </div>
                <div class="col-md-6 mb-3">
                    <label for="ccnumber">Credit card number</label>
                    <input type="text" class="form-control" name="cc_number" id="ccnumber" placeholder="" value="" >
                    <div class="invalid-feedback">
                        Credit card number is required
                    </div>
                </div>
            </div>
            <div class="row">
                <div class="col-md-3 mb-3">
                    <label for="ccexp">Expiration</label>
                    <input type="text" class="form-control" name="cc_exp" id="ccexp" placeholder="" value="1209" required>
                    <div class="invalid-feedback">
                        Expiration date required
                    </div>
                </div>
                <div class="col-md-3 mb-3">
                    <label for="cccvv">CVV</label>
                    <input type="text" class="form-control" name="cc_cvv" id="cccvv" placeholder="" value="333" required>
                    <div class="invalid-feedback">
                        Security code required
                    </div>
                </div>
            </div>
            <hr class="mb-4">

            <hr class="mb-4">
            <button class="btn btn-primary btn-lg btn-block" type="submit">
                <i class="fa fa-check"></i> Submit
            </button>
        </form>

1 Ответ

2 голосов
/ 25 января 2020

Вы можете установить SESSION_DRIVER=file в вашем файле .env

Затем запустить php artisan config:clear

Кажется связанным

...