中间件与控制器 __construct 中间件冲突(请求验证错误不起作用)
middleware conflicts with controller __construct middleware (request validation error not working)
我正在为用户角色使用中间件。
但是当我在 Controller __construct 方法中使用中间件时,请求验证无法正常工作。它没有显示任何错误,会话错误包 returns 为空。提交表单时我看不到任何错误。但是当我在构造中禁用中间件时,我可以看到请求验证错误。
web.php 中间件 + 控制器 _construct 中间件 = 请求验证不起作用。
web.php 中间件 + 没有 _construct 中间件 = 工作正常。
没有 web.php 中间件 + _construct 中间件 = 工作正常。
我在代码中显示了详细信息。
各种方法都试了一个星期了,还是解决不了。
真诚期待您的帮助。
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]);
}
中间件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">×</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>
您可以在 .env 文件中设置 SESSION_DRIVER=file
然后运行php artisan config:clear
我正在为用户角色使用中间件。 但是当我在 Controller __construct 方法中使用中间件时,请求验证无法正常工作。它没有显示任何错误,会话错误包 returns 为空。提交表单时我看不到任何错误。但是当我在构造中禁用中间件时,我可以看到请求验证错误。
web.php 中间件 + 控制器 _construct 中间件 = 请求验证不起作用。
web.php 中间件 + 没有 _construct 中间件 = 工作正常。
没有 web.php 中间件 + _construct 中间件 = 工作正常。
我在代码中显示了详细信息。
各种方法都试了一个星期了,还是解决不了。 真诚期待您的帮助。
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]);
}
中间件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">×</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>
您可以在 .env 文件中设置 SESSION_DRIVER=file
然后运行php artisan config:clear