如何将中间件与资源一起使用?
Route::resource('myitem', ['middleware' => 'auth', 'uses' => 'App\\Controllers\\MyitemsController']);
刚刚关注https://laracasts.com/discuss/channels/general-discussion/struggling-with-routeresource-and-auth-middleware,但遗憾的是无法解决。
获取错误:
ErrorException (E_UNKNOWN)
Array to string conversion
Open: /vendor/laravel/framework/src/Illuminate/Routing/Router.php
protected function getResourceAction($resource, $controller, $method, $options)
{
$name = $this->getResourceName($resource, $method, $options);
return array('as' => $name, 'uses' => $controller.'@'.$method);
}
答案 0 :(得分:3)
中间件是Laravel 5的一个新功能。在Laravel 4中,过滤器类似的东西。因此,您应该使用middleware
或before
而不是使用密钥after
。此外,以及错误来自的地方,Route::resource
的第二个参数应该是控制器名称作为字符串,第三个参数是一个选项数组:
Route::resource('myitem', 'App\\Controllers\\MyitemsController', ['before' => 'auth']);
显然,在过滤器只围绕它时,过滤器只能处理资源路由。有关示例,请参阅OP答案......
答案 1 :(得分:3)
使用带资源的过滤器无效,为什么必须使用Route::group
Route::group(array('before' => 'auth'), function()
{
Route::resource('myitem', 'App\\Controllers\\MyitemsController');
});
答案 2 :(得分:0)
我刚刚反对这一点,发现最简单的方法是将中间件直接添加到控制器。
我在这里找到了答案: http://laravel.com/docs/master/controllers
class MyitemsController extends Controller {
/**
* Instantiate a new MyitemsController instance.
*/
public function __construct()
{
$this->middleware('auth');
}
}
答案 3 :(得分:0)
如何在 Laravel 5 中执行此操作。你一直在等待的答案。
使用middleware
代替before
Route::group(array('middleware' => 'auth'), function()
{
Route::resource('user', 'UserController',
['only' => ['edit']]);
}
要检查路线是否已设置,请运行:
php artisan route:list
应显示以下内容:
GET|HEAD | user/{user}/edit | user.edit | App\Http\Controllers\UserController@edit | auth
注意auth
而不是guest
答案 4 :(得分:0)
更好的解决方案
使用中间件而不是之前
Route::group(['middleware' => 'auth'], function(){
Route::resource('myitem', 'MyitemsController');
});
您可以查看是否可以:
php artisan route:list