带有身份验证的Laravel 5.7.6资源路由

时间:2018-10-03 08:40:41

标签: php laravel authentication authorization

我正在开始我的第一个Laravel项目(实际上是第一个MVC / OOPHP项目),并且可以在路线方面使用一些帮助。

我按照https://medium.com/employbl/easily-build-administrator-login-into-a-laravel-5-app-8a942e4fef37上的指南添加了检查,以确保用户在加载页面时是否是管理员。它适用于普通视图路线,例如

Route::get('/admin/something', 'AdminController@admin_something')
->middleware('is_admin')
->name('admin');

但是我现在有一条资源路由,当我在路由中添加两行->时出现错误。因此,此方法无需身份验证即可:

Route::resource('thingies', 'ThingyController');

但是,这个:

Route::resource('thingies', 'ThingyController')
->middleware('is_admin')
->name('admin');

我收到错误Symfony \组件\调试\异常\ FatalThrowableError(E_RECOVERABLE_ERROR) 函数Illuminate \ Routing \ PendingResourceRegistration :: name()的参数太少,第24行的/var/www/routes/web.php中传递了1个参数,而恰好传递了2个参数

要将此身份验证添加到资源路由,我需要做些什么?

教程中的is_admin()函数:

const ADMIN_TYPE = 'admin';
const DEFAULT_TYPE = 'default';
public function isAdmin()    {        
     return $this->type === self::ADMIN_TYPE;    
}

和中间件:

namespace App\Http\Middleware;

use Closure;

class IsAdmin
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
    public function handle($request, Closure $next)
    {
        if(auth()->user()->isAdmin()) {
            return $next($request);
        }
        return redirect('home');
    }
}

2 个答案:

答案 0 :(得分:1)

您不能为resource route指定一个“名称”。但是您可以分别为resource controller中的每个方法命名。

为此,name()函数需要2个参数。

  1. 方法名称
  2. 该方法路线的名称。

Route::resource('thingies', 'ThingyController')
    ->middleware('is_admin')
    ->name('create', 'admin.create');

答案 1 :(得分:1)

您不能在资源路由的末尾用->name('admin');命名路由“ admin” ,因为它在一条语句中涉及所有CRUD路由,并且Laravel内置系统已经命名他们。

您的方法不错,只需像这样删除最后一行,就可以了:

Route::resource('thingies', 'ThingyController') ->middleware('is_admin');

相关问题