如何在Laravel的容器中重新绑定?

时间:2015-10-22 20:31:39

标签: laravel laravel-5 request ioc-container

我正在尝试在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个实例?

1 个答案:

答案 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()的任何调用都会使用我的自定义逻辑解析用户。