无法使用Laravel资源控制器删除,(此操作未经授权)

时间:2016-06-19 05:56:38

标签: php laravel authentication resources

我试图使用Laravel资源调用delete方法,但我不能这样做,我一直在

此操作是未经授权的错误

这是我的文件

routes.php文件

Route::resource('/types','TypeController');

TypeController.php

 public function __construct()
{
    $this->middleware('auth');
}

public function destroy(Request $request, Type $type){
    $this->authorize('destroy',$type);
    $type->delete();
    return redirect('/types');
}

TypePolicy.php

class TypePolicy
{

  public function destroy(User $user, Type $type){
     return $user->id === $type->user_id;
  }

}

AuthServiceProvider.php

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Type' => 'App\Policies\TypePolicy',
];

查看

{{ Form::open(array('route' => array('types.destroy', $type), 'method' => 'post')) }}
 {{ csrf_field() }}
<input type="hidden" name="_method" value="DELETE">
<button type="submit" id="delete-type-{{ $type->id }}" class="btn btn-danger">Delete</button>
{{ Form::close() }}

1 个答案:

答案 0 :(得分:1)

路由参数名称必须与方法上的参数名称匹配,才能使隐式绑定生效。 Route::resource的第一个参数是资源名称,用于路由&#39;参数&#39;也是名字。

您的路线参数是&#39;类型&#39;并且您的方法参数是&#39; type&#39;。

如果您仍希望网址为&#39; type&#39;但是要输入&#39;类型的参数,您可以告诉路由器使您的资源路由参数变为单数。

RouteServiceProvider@boot

public function boot(Router $router)
{
    $router->singularResourceParameters();

    parent::boot($router);
}

现在,您的URI类似types/{type},与您的方法签名中的Type $type匹配。

如果您不希望所有资源路由参数都是单一的,那么您也可以只为该资源执行此操作。

Route::resource('types', 'TypeController', ['parameters' => 'singular']);

Laravel Docs - Controllers - Restful - Naming Resource Route Paramters