应用中间件后,服务提供商中的访问请求

时间:2016-05-31 20:40:13

标签: laravel laravel-5 ioc-container

绑定

我在接口和实现之间使用服务提供程序中的绑定:

public function register()
{
    $this->app->bind('MyInterface', MyImplementation::class);
}

中间件

在我的中间件中,我为请求添加了一个属性:

public function handle($request, Closure $next)
{
    $request->attributes->add(['foo' => 'bar]);
    return $next($request);
}

现在,我想访问我的服务提供商

中的foo
public function register()
{
    $this->app->bind('MyInterface', new MyImplementation($this->request->attributes->get('foo')); // Request is not available
}

在应用中间件之前调用register()。我知道。

如果设置了request-> attributes-> get('foo'),我正在寻找一种“重新绑定”的技术

3 个答案:

答案 0 :(得分:15)

试试这样:

public function register()
{
    $this->app->bind('MyInterface', function () {
        $request = app(\Illuminate\Http\Request::class);

        return app(MyImplementation::class, [$request->foo]);
    }
}

绑定元素的工作原理是只有在调用它们时才会触发它们。

答案 1 :(得分:1)

service provider中,您还可以通过以下方式访问Request Object

public function register()
{
    $request = $this->app->request;
}

答案 2 :(得分:0)

尝试一下

public function register()
{
    $this->app->bind('MyInterface', function ($app) {
        return new MyImplementation(request()->foo);
    }
}