我正在尝试在Laravel的Request
类中添加类似于用户解析器的功能。
我有一个SaaS应用程序。我创建了一个中间件类来查看请求主机并根据域获取相应的帐户。它看起来像这样:
public function handle($request, Closure $next)
{
$host = $request->getHost();
$domain = Domain::whereName($host)->firstOrFail();
return $next($request);
}
我已经在我的应用程序中扩展了Request
类,并更新了 public / index.php 中的引用以使用这个新类。我还添加了三种新方法:
public function account()
{
return call_user_func($this->getAccountResolver());
}
public function getAccountResolver()
{
return $this->accountResolver ?: function () {};
}
public function setAccountResolver(Closure $callback)
{
$this->accountResolver = $callback;
return $this;
}
我的想法是,我希望能够以与获取当前登录用户相同的方式从请求中获取帐户:
$user = $request->user();
$account = $request->account(); // My new method
我查看了Laravel代码库,他们似乎使用重新绑定来添加用户解析器。来自AuthServiceProvider
类:
$this->app->rebinding('request', function ($app, $request) {
$request->setUserResolver(function () use ($app) {
return $app['auth']->user();
});
});
所以我在我的中间件方法中复制了这个:
$this->app->rebinding('request', function ($app, $request) use ($domain) {
$request->setAccountResolver(function () use ($app, $domain) {
return $domain->account; // Domain belongs to an Account
});
});
但这似乎没有被触发。如果我在中间件中运行dd($request)
,我可以看到$accountResolver
属性是Closure
(我的回调)的实例,但是当我dd($request)
之后中间件类(比如控制器操作),$accountResolver
方法又恢复为null
。
如何让我的帐户解析程序在我的中间件之后保留,以便我可以在整个应用程序中调用$request->account()
并获得Account
个实例?
答案 0 :(得分:2)
我在谷歌搜索这个问题之后在另一个项目中解决了这个问题,并讽刺地结束了我自己的问题!
在我的 AppServiceProvider 的register()
方法中,我有以下代码:
$this->app->rebinding('request', function ($app, $request) {
$request->setUserResolver(function () {
// Customer user resolving logic here
});
}
在我的控制器中,如果我键入提示Request
类......
public function index(Request $request)
{
//
}
...然后对$request->user()
的任何调用都会使用我的自定义逻辑解析用户。