【问题标题】:Laravel 5.7.6 resource route with auth带有身份验证的 Laravel 5.7.6 资源路由
【发布时间】:2018-10-03 08:40:41
【问题描述】:

我正在开始我的第一个 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 \ Component \ Debug \ Exception \ 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');
    }
}

【问题讨论】:

    标签: php laravel authentication authorization


    【解决方案1】:

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

    你的方法很好,只需像这样删除最后一行,它应该可以工作:

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

    【讨论】:

    • 谢谢你 - 它摆脱了那个错误,而是给了一个新的错误! “在 null 上调用成员函数 isAdmin()”。我已将它引用的函数(来自链接的教程)添加到我的问题中。
    • 看完教程,其实不是你贴的函数声明,而是使用它的类中间件。你是用Tinker来测试的吗?
    • 对不起,这就是我的意思(仍然习惯于术语)。这是错误页面所指的位。更新了问题以澄清。我没有用 Tinker 测试过。我正在使用 Laradock(Docker 容器)为站点提供服务,如果有帮助,我可以访问容器内的 Artisan?
    • 感谢编辑,这里的问题是在您的测试中调用 auth()->user() 返回 null,您确定您在 DB 中的用户条目吗?
    • 哦,是的,我有一个管理员用户。实际上,我在“类型”列中创建了一堆具有不同值的测试用户,但我想这不会破坏它?它确实适用于其他路线(正常视图路线)。
    【解决方案2】:

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

    这样做name()函数需要2个参数。

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

    ,

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

    【讨论】:

    • 谢谢,这也解决了第一个错误,但给了我“在 null 上调用成员函数 isAdmin()”。我已将它引用的功能(来自链接的教程)添加到我的问题中。我也不是 100% 清楚我将如何进行此修复 - 我会为每个 CRUD 功能添加一条新路线吗?
    猜你喜欢
    • 2014-02-04
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2014-06-24
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多