我的所有路由组上的中间件过滤器,一个除外
Middleware filter on all my route group except one
我在 laravel 5.7 的路由组上激活中间件时遇到问题。
这是一个简单的中间件,用于过滤器 post(在我的例子中是中心),它是或不是登录用户。
我在一组 4 个路由(编辑、删除、显示和销毁)上激活了中间件,它对所有人都可以,但不能更新。更新没人能做到。
我在 Centrepolicy 中有这个中间件
<?php
namespace App\Policies;
use Illuminate\Support\Facades\Auth;
use App\Models\Auth\User;
use App\models\Centre;
use Illuminate\Auth\Access\HandlesAuthorization;
class CentrePolicy
{
use HandlesAuthorization;
public function manage(User $user, Centre $centre)
{
if(!Auth::user()->hasRole('administrator')) {
return $user->id === $centre->user_id;
}
return true;
}
我的路线
/*
* All route names are prefixed with 'admin.auth'.
*/
Route::group([
'prefix' => 'auth',
'as' => 'auth.',
'namespace' => 'Auth',
'middleware' => ['permission:voir liste centre']
], function () {
Route::group(['namespace' => 'Centre'], function () {
Route::get('centres/create', 'CentreController@create')->name('centre.create');
Route::get('centres', 'CentreController@index')->name('centre.index');
Route::post('centres/store', 'CentreController@store')->name('centre.store');
});
Route::group(['prefix' => 'centres/{centre}', 'namespace' => 'Centre', 'middleware' => ['can:manage,centre']], function () {
Route::get('/edit', 'CentreController@edit')->name('centre.edit');
Route::get('/show', 'CentreController@show')->name('centre.show');
Route::put('/update', 'CentreController@update')->name('centre.update');
Route::get('/delete', 'CentreController@destroy')->name('centre.destroy');
});
我的控制器
<?php
namespace App\Http\Controllers\Backend\Auth\Centre;
use Illuminate\Http\Request;
use App\Models\Centre;
use App\Models\Auth\user;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class CentreController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Guard $auth)
{
/// $centres = centre::get()->paginate(5);
$centres = DB::table('centres')->paginate(10 );
if(!Auth::user()->hasRole('administrator')) {
$centres = $auth->user()->centre()->paginate(10);
}
return view('backend.centre.index', compact('centres'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$centre = new Centre;
return view('backend.centre.createcentre', ['centre' => $centre ]);
/// return view('backend.centre.createcentre');
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(Request $request)
{
$centres = new Centre($request->all());
$centres->user_id = Auth::user()->id;
$centres->save();
return redirect()->route('admin.auth.centre.index');
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show(Centre $centre)
{
return view('backend.centre.show', compact('centre'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit(Centre $centre)
{
return view('backend.centre.editcentre', compact('centre'));
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update($id, Request $request)
{
$centres = Centre::find($id);
$centres->update($request->all());
return redirect()->route('admin.auth.centre.index');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy(Centre $centre)
{
$centre->delete();
return redirect()->route('admin.auth.centre.index');
}
}
还有我的模特
<?php
namespace App\Models;
use App\Models\Auth\user;
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;
class Centre extends Model
{
protected $fillable = ['titre', 'description', 'enligne', 'user_id', 'capacite', 'slug'];
/*
public function setSlugAttribute($value)
{
if (empty($slug)) {
$this->attributes['slug'] = str_slug($this->titre);
}
}
*/
public function user()
{
return $this->belongsTo(User::class);
}
我的编辑路线表格是
<?php
///dd($centre);
if($centre->id){
$options = ['method' =>'put', 'route' =>['admin.auth.centre.update', $centre]];
} else {
$options = ['method' =>'post', 'route' => ['admin.auth.centre.store']];
}
?>
{!! Form::model($centre, $options) !!}
<div class="form-group">
{{ Form::label('Titre', 'Titre', ['class' => 'control-label']) }}
{!! Form::text('titre', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{{ Form::label('description', 'description', ['class' => 'control-label']) }}
{!! Form::textarea('description', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{{ Form::label('capacité maximum', 'capacite', ['class' => 'control-label']) }}
{!! Form::textarea('capacite', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::hidden('enligne', '0') !!}
{!! Form::checkbox('enligne', '1' , null) !!}
</div>
{!!Form::submit("Envoyer", ['class' => 'btn btn-primary'])!!}
{!! Form::close() !!}
当我到达 admin/auth/centres/13/update 的更新页面时,我遇到了 403 错误,在调试栏中我有 3 个门,前 2 个正常,最后 :
success
array:4 [▼
"ability" => "view backend"
"result" => true
"user" => 1
"arguments" => "[]"
]
success
array:4 [▼
"ability" => "voir liste centre"
"result" => true
"user" => 1
"arguments" => "[]"
]
error
array:4 [▼
"ability" => "manage"
"result" => null
"user" => 1
"arguments" => "[0 => 13]"
]
我认为参数有问题,但是这条路线与delete/show/destroy相同,所以我不明白
编辑今天我试着写这样的中间件:
public function manage(User $user, Centre $centre)
{
return true;
}
但无事可做,不工作。什么操作可以仅在更新路由上停用此中间件,因为它在另外 3 个路由上处于活动状态并且正常?
我认为问题在于您试图访问 id
作为函数中的第一个参数,而 Request
作为第二个参数。它应该与 Laravel
一起工作的方式是,如果你在函数内部需要 Request
,它总是必须是 first parameter inside the function
然后所有其他参数都可以跟随,如果出于某种原因您不需要 Request
并且您不将其作为 function parameter
包含,那么您可以使用 other parameter as first one
,但是一旦您添加 Request
作为参数之一,它必须是 first parameter
.
所以我认为一个简单的修复方法是:
...
public function update(Request $request, $id) {
...
编辑:在您通过向我们展示您如何发送您正在更新的模型的 id
来更新您的答案后,在我看来您发送错误。应该是这样的:
...
$options = ['method' =>'put', 'route' => ['admin.auth.centre.update', $centre->id]];
...
编辑:我想到的另一件事是,当您已经在 $user
变量中获得 Authenticated user
时,为什么还要从 Policy
内部使用 Auth::user()
?
尝试将您的 if statement
代码更改为:
...
if(!$user->hasRole('administrator')) {
return $user->id === $centre->user_id;
}
...
我在 laravel 5.7 的路由组上激活中间件时遇到问题。 这是一个简单的中间件,用于过滤器 post(在我的例子中是中心),它是或不是登录用户。
我在一组 4 个路由(编辑、删除、显示和销毁)上激活了中间件,它对所有人都可以,但不能更新。更新没人能做到。
我在 Centrepolicy 中有这个中间件
<?php
namespace App\Policies;
use Illuminate\Support\Facades\Auth;
use App\Models\Auth\User;
use App\models\Centre;
use Illuminate\Auth\Access\HandlesAuthorization;
class CentrePolicy
{
use HandlesAuthorization;
public function manage(User $user, Centre $centre)
{
if(!Auth::user()->hasRole('administrator')) {
return $user->id === $centre->user_id;
}
return true;
}
我的路线
/*
* All route names are prefixed with 'admin.auth'.
*/
Route::group([
'prefix' => 'auth',
'as' => 'auth.',
'namespace' => 'Auth',
'middleware' => ['permission:voir liste centre']
], function () {
Route::group(['namespace' => 'Centre'], function () {
Route::get('centres/create', 'CentreController@create')->name('centre.create');
Route::get('centres', 'CentreController@index')->name('centre.index');
Route::post('centres/store', 'CentreController@store')->name('centre.store');
});
Route::group(['prefix' => 'centres/{centre}', 'namespace' => 'Centre', 'middleware' => ['can:manage,centre']], function () {
Route::get('/edit', 'CentreController@edit')->name('centre.edit');
Route::get('/show', 'CentreController@show')->name('centre.show');
Route::put('/update', 'CentreController@update')->name('centre.update');
Route::get('/delete', 'CentreController@destroy')->name('centre.destroy');
});
我的控制器
<?php
namespace App\Http\Controllers\Backend\Auth\Centre;
use Illuminate\Http\Request;
use App\Models\Centre;
use App\Models\Auth\user;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class CentreController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Guard $auth)
{
/// $centres = centre::get()->paginate(5);
$centres = DB::table('centres')->paginate(10 );
if(!Auth::user()->hasRole('administrator')) {
$centres = $auth->user()->centre()->paginate(10);
}
return view('backend.centre.index', compact('centres'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$centre = new Centre;
return view('backend.centre.createcentre', ['centre' => $centre ]);
/// return view('backend.centre.createcentre');
}
/**
* Store a newly created resource in storage.
*
* @return Response
*/
public function store(Request $request)
{
$centres = new Centre($request->all());
$centres->user_id = Auth::user()->id;
$centres->save();
return redirect()->route('admin.auth.centre.index');
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
*/
public function show(Centre $centre)
{
return view('backend.centre.show', compact('centre'));
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return Response
*/
public function edit(Centre $centre)
{
return view('backend.centre.editcentre', compact('centre'));
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
*/
public function update($id, Request $request)
{
$centres = Centre::find($id);
$centres->update($request->all());
return redirect()->route('admin.auth.centre.index');
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
*/
public function destroy(Centre $centre)
{
$centre->delete();
return redirect()->route('admin.auth.centre.index');
}
}
还有我的模特
<?php
namespace App\Models;
use App\Models\Auth\user;
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasRoles;
class Centre extends Model
{
protected $fillable = ['titre', 'description', 'enligne', 'user_id', 'capacite', 'slug'];
/*
public function setSlugAttribute($value)
{
if (empty($slug)) {
$this->attributes['slug'] = str_slug($this->titre);
}
}
*/
public function user()
{
return $this->belongsTo(User::class);
}
我的编辑路线表格是
<?php
///dd($centre);
if($centre->id){
$options = ['method' =>'put', 'route' =>['admin.auth.centre.update', $centre]];
} else {
$options = ['method' =>'post', 'route' => ['admin.auth.centre.store']];
}
?>
{!! Form::model($centre, $options) !!}
<div class="form-group">
{{ Form::label('Titre', 'Titre', ['class' => 'control-label']) }}
{!! Form::text('titre', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{{ Form::label('description', 'description', ['class' => 'control-label']) }}
{!! Form::textarea('description', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{{ Form::label('capacité maximum', 'capacite', ['class' => 'control-label']) }}
{!! Form::textarea('capacite', null, ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::hidden('enligne', '0') !!}
{!! Form::checkbox('enligne', '1' , null) !!}
</div>
{!!Form::submit("Envoyer", ['class' => 'btn btn-primary'])!!}
{!! Form::close() !!}
当我到达 admin/auth/centres/13/update 的更新页面时,我遇到了 403 错误,在调试栏中我有 3 个门,前 2 个正常,最后 :
success
array:4 [▼
"ability" => "view backend"
"result" => true
"user" => 1
"arguments" => "[]"
]
success
array:4 [▼
"ability" => "voir liste centre"
"result" => true
"user" => 1
"arguments" => "[]"
]
error
array:4 [▼
"ability" => "manage"
"result" => null
"user" => 1
"arguments" => "[0 => 13]"
]
我认为参数有问题,但是这条路线与delete/show/destroy相同,所以我不明白
编辑今天我试着写这样的中间件:
public function manage(User $user, Centre $centre)
{
return true;
}
但无事可做,不工作。什么操作可以仅在更新路由上停用此中间件,因为它在另外 3 个路由上处于活动状态并且正常?
我认为问题在于您试图访问 id
作为函数中的第一个参数,而 Request
作为第二个参数。它应该与 Laravel
一起工作的方式是,如果你在函数内部需要 Request
,它总是必须是 first parameter inside the function
然后所有其他参数都可以跟随,如果出于某种原因您不需要 Request
并且您不将其作为 function parameter
包含,那么您可以使用 other parameter as first one
,但是一旦您添加 Request
作为参数之一,它必须是 first parameter
.
所以我认为一个简单的修复方法是:
...
public function update(Request $request, $id) {
...
编辑:在您通过向我们展示您如何发送您正在更新的模型的 id
来更新您的答案后,在我看来您发送错误。应该是这样的:
...
$options = ['method' =>'put', 'route' => ['admin.auth.centre.update', $centre->id]];
...
编辑:我想到的另一件事是,当您已经在 $user
变量中获得 Authenticated user
时,为什么还要从 Policy
内部使用 Auth::user()
?
尝试将您的 if statement
代码更改为:
...
if(!$user->hasRole('administrator')) {
return $user->id === $centre->user_id;
}
...