php - 拉拉维尔 4 : Pass model from filter to controller action

标签 php authentication laravel filter controller

我的应用程序有 3 种不同的场景:

  1. 只有授权用户才能访问 Controller 操作
  2. 只有未经授权的用户才能访问 Controller 操作
  3. 任何用户都可以访问 Controller 操作,但身份验证检查已完成

前两个场景由简单的过滤器处理,并且由于所有场景在逻辑上都是相似的,因此似乎剩余的场景也应该由过滤器处理。

所以,我想做的是: 当用户访问某些特定的 Controller 操作(即 HomeController@getIndex)时,过滤器应检查用户是否被授权,将 Controller 的 $user 属性设置为 Auth::user() 值并在所有 View 之间共享该值。这是我想出的代码:

Router::filter('auth', function() {
    $route = Str::parseCallback(Route::currentRouteAction(), null); // 0 - controller name, 1 - controller action name

    $controller = App::make($route[0]);

    $user = Auth::user();
    $controller->user = $user;
    View::share('user', $user);

    return $controller->{$route[1]}();
});

此代码有效,但是 Controller 被调用两次(即当 Controller 操作没有 return 构造时),并且 auth 过滤器在任何其他 'before' 过滤器之前调用 Controller 被调用。

第二个解决方案: 创建 AuthController ,并使用它的构造函数来设置 $user 属性,但是将为每个子 Controller 操作调用构造函数(我想仅在特定操作上运行它,所以我认为过滤器是可行的方法)。

第三种解决方案: 创建 UserRepository 并编写一个方法,该方法将执行所有身份验证操作,并从需要身份验证的操作中调用它(不设置 $user 属性)。对于几行代码来说,这个解决方案似乎有点过分了。

第四种解决方案: 将 Auth::user() 值直接传递给 Controller ​​操作(作为参数),但我还没有找到任何方便的方法来执行此操作。

是否有任何一种“最佳实践”解决方案可以以所描述的方式处理身份验证? 还有其他方法可以解决这个问题吗?

最佳答案

最佳实践可能是为每个注入(inject)用户存储库的 Controller 创建一个 UserRepository 类和服务提供程序,但正如您所说,对于简单的事情可能有点过分了。

也许一个更简单的解决方案是向 BaseController.php 添加一个设置用户的函数。

public function setUser()
{
    $this->user = Auth::user();
}

然后每当您需要设置用户时,只需调用 $controller->setUser(); 即可。如果您始终需要 Controller 执行此操作,只需在构造函数中调用 $this->setUser() 即可使其始终可用。

关于php - 拉拉维尔 4 : Pass model from filter to controller action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507381/

相关文章:

javascript - 使用 Google oAuth 2.0 时刷新新用户登录页面

PHP curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false) 太慢

authentication - 如何使用带有凭据的 UrlFetchApp?谷歌脚本

linux - 我想在没有 PDO 的情况下使用 laravel

php - PDO 查询绑定(bind)字符串而不是整数返回结果

php - 如何解决数组中不存在的索引?

authentication - React-redux 客户端 token

security - JWT(JSON Web Token)自动延长过期时间

laravel - 覆盖 Laravel 队列监听器输出 [仅限 Laravel <=5.2]

javascript - Vue DevTools 正确更新但浏览器窗口不更新