我的应用程序有 3 种不同的场景:
- 只有授权用户才能访问 Controller 操作
- 只有未经授权的用户才能访问 Controller 操作
- 任何用户都可以访问 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/