【问题标题】:Laravel 5.6 distribute routes by user paramsLaravel 5.6 通过用户参数分配路由
【发布时间】:2019-01-08 22:46:07
【问题描述】:

app/routes/web.php的路线中,我有一个小组,里面有一堆资源路线:

Route::group(['middleware' => 'auth'], function()
{
   Route::get('/points', 'PagesController@points');
   Route::get('/users', 'PagesController@users');
   Route::get('/users/groups', 'PagesController@user_groups');
   Route::resource('point', 'PointController');
   Route::resource('user', 'UserController');
   Route::resource('users/group', 'UserGroupController');
});

Auth::routes();

Route::get('/logout', 'Auth\LoginController@logout')->name('logout');

现在我想通过用户参数在这个组中分配路由:

use App\UserGroup;

$access = UserGroup::find( auth()->user()->group_id )->access;

Route::group(['middleware' => 'auth'], function()
{
   if ($access == 1) {
      Route::get('/points', 'PagesController@points');
      Route::get('/users', 'PagesController@users');
      Route::get('/users/groups', 'PagesController@user_groups');
      Route::resource('point', 'PointController');
      Route::resource('user', 'UserController');
      Route::resource('users/group', 'UserGroupController');
   }
});

但我无法在 Route::group 中正确获取用户参数,因为发生错误:Trying to get property 'group_id' of non-object

如何在中间件之前的app/routes/web.php中获取auth()->user()->group_id

【问题讨论】:

    标签: php laravel authentication laravel-5 routes


    【解决方案1】:

    在回调中使用 $access 参数

    $access = UserGroup::find( auth()->user()->group_id )->access
    
    Route::group(['middleware' => 'auth'], function() use ($access)
    {
       if ($access == 1) {
          Route::get('/points', 'PagesController@points');
          Route::get('/users', 'PagesController@users');
          Route::get('/users/groups', 'PagesController@user_groups');
          Route::resource('point', 'PointController');
          Route::resource('user', 'UserController');
          Route::resource('users/group', 'UserGroupController');
       }
    });
    

    【讨论】:

    • 谢谢!无论如何,我只能在Route::get 函数内部访问auth()->user(),但不能在Route::group 之前或在它内部。
    【解决方案2】:

    你可以create中间件'GroupAccess'。然后assign it to alias,即

    'groupAccess' => \App\Http\Middleware\GroupAccess::class
    

    最后在它的处理方法中检查你的状况

    public function handle($request, Closure $next)
    {
        if (UserGroup::find( auth()->user()->group_id )->access === 1)
            return $next($request);
        else
            return back();
    }
    

    然后在路由组中指定这个中间件

    Route::group(['middleware' => ['auth','groupAccess']], function()
    {
          Route::get('/points', 'PagesController@points');
          Route::get('/users', 'PagesController@users');
          Route::get('/users/groups', 'PagesController@user_groups');
          Route::resource('point', 'PointController');
          Route::resource('user', 'UserController');
          Route::resource('users/group', 'UserGroupController');
    });
    

    【讨论】:

    • 谢谢!但是现在出现错误:Class groupAccess does not exist
    • 您需要先注册您的中间件。我更新了我的答案,请检查一下
    • 尝试将return back();替换为return redirect('/');
    • 非常感谢,我已经在内核中的所有中间件数组中添加了GroupAccess 类,但现在最近创建的中间件出现了新错误GroupAccess.php:Trying to get property 'group_id' of non-object
    • 如果您不需要在对应用程序的每个请求期间运行中间件,则永远不要将中间件放置到 protected $middleware。在您的情况下,它可能会触发该错误。
    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 2019-07-02
    • 2018-11-16
    • 1970-01-01
    • 2018-08-01
    • 2019-03-31
    • 2020-11-29
    相关资源
    最近更新 更多