laravel - 如何在 Laravel 的容器中重新绑定(bind)?

我正在尝试在 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 代码库,他们似乎使用重新绑定(bind)来添加用户解析器。来自 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) after 中间件类(比如 Controller 操作)时,$accountResolver 方法又回到了

如何让我的帐户解析器在我的中间件之后持续存在,以便我可以调用 $request->account() 并在我的应用程序中获取一个 Account 实例?

最佳答案

在谷歌搜索这个问题后,我在另一个项目中解决了这个问题,但具有讽刺意味的是,我自己的问题结束了!

在我的 AppServiceProviderregister() 方法中,我有这段代码:

$this->app->rebinding('request', function ($app, $request) {
    $request->setUserResolver(function () {
        // Customer user resolving logic here
    });
}

在我的 Controller 中,如果我对 Request 类进行类型提示......

public function index(Request $request)
{
    //
}

...然后对 $request->user() 的任何调用都会使用我的自定义逻辑解析用户。

https://stackoverflow.com/questions/33290192/

相关文章:

html - 滚动超出顶部或底部时操纵浏览器窗​​口的颜色

amazon-web-services - Ansible:为新创建的实例分配一个弹性IP

iis - 如何在没有收到确认消息的情况下退出 IIS Express 工作进程?

git - SourceTree 将 pull 的文件视为未提交的更改

jboss - Keycloak 自定义验证输出消息

html - HTML LocalStorage 中的数据在其他窗口/选项卡中可用所需的时间

isabelle - 使用集合理解的函数的终止证明

angularjs - 如何使用 Firebase 和 AngularJS 创建评论线程?

maven - hudson:maven-sonar-plugin 执行无法从服务器下载库

gstreamer - 使用 Gstreamer 编码/解码 VP8 或 VP9?