我有这样的update
和store
方法
public function update(ContactRequest $request)
{
if (Auth::user()->can('edit_contact'))
$request->update();
else
return $this->accessDenied();
}
public function store(ContactRequest $request)
{
if (Auth::user()->can('add_contact'))
$request->store();
else
return $this->accessDenied();
}
和FormRequest
类authorize
public function authorize()
{
return Gate::allows('test', $this->route('contact'));
}
我想将权限名称传递给authorize
方法,如下所示:
public function authorize($permissionName)
{
if (Auth::user()->can($permissionName))
return Gate::allows('test', $this->route('contact'));
}
在这样的控制器中
public function update(ContactRequest $request)
{
$request->update('edit_contact');
}
public function store(ContactRequest $request)
{
$request->store('add_contact');
}
您有 3 个选项:
-
将您的授权方法更改为:
public function authorize() { return $this->user()->can( $this->route()->getActionMethod() === 'store' ? 'add_contact' : 'edit_contact' ) && Gate::allows('test', $this->route('contact')); }
-
使请求返回
authorize
方法true
,并通过定义另一个门来检查授权,并在控制器上调用它:public function authorize() { return true; }
Gate::define('modify_contact', function ($user, $permissionName) { return $user->can($permissionName) && $user->can('test', $request->route('contact')); });
public function update(ContactRequest $request) { Gate::authorize('modify_contact', 'edit_contact'); //... } public function store(ContactRequest $request) { Gate::authorize('modify_contact', 'add_contact'); //... }
-
以相同的方式定义和使用策略,并将参数传递给它。
没有直接的方法来传递参数来授权表单请求的方法,但您可以通过以下方式实现:
public function authorize()
{
$method = Request::method();
if($method == 'post') {
$permission = 'add_contact';
} elseif($method == 'put') {
$permission = 'edit_contact';
}
if (Auth::user()->can($permission))
return Gate::allows('test', $this->route('contact'));
}
如果您使用的是 laravel 的默认帖子,请放置路线,那么这将对您有所帮助。
最好发出两个不同的存储和更新请求,无论如何您需要检查一些取决于操作的值。 因此,您可以为资源控制器使用默认的 laravel 策略方法,而不将Request::authorize
用于授权逻辑。 Laravel策略控制器助手