Laravel 应用中间件后服务提供者中的访问请求 绑定

Laravel 应用中间件后服务提供者中的访问请求 绑定,laravel,laravel-5,ioc-container,Laravel,Laravel 5,Ioc Container,我在我的服务提供者中使用接口和实现之间的绑定: public function register() { $this->app->bind('MyInterface', MyImplementation::class); } 中间件 在我的中间件中,我向请求添加了一个属性: public function handle($request, Closure $next) { $request->attributes->add(['foo' => 'b

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

public function register()
{
    $this->app->bind('MyInterface', MyImplementation::class);
}
中间件 在我的中间件中,我向请求添加了一个属性:

public function handle($request, Closure $next)
{
    $request->attributes->add(['foo' => 'bar]);
    return $next($request);
}
现在,我想在我的服务提供商中访问
foo
在应用中间件之前调用register()。我知道。 如果设置了请求->属性->获取('foo'),我正在寻找一种“重新绑定”的技术

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

        return app(MyImplementation::class, [$request->foo]);
    }
}
绑定元素是这样工作的,它们只有在被调用时才会被触发。

试试这个

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

服务提供商
中,您还可以通过以下方式访问
请求对象

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

但总的来说,这不是一种糟糕的做法吗?启动SPs是引导过程的一部分,稍后处理请求。这听起来有点尴尬——根据请求更改引导过程。你不应该用别的方法解决你的问题吗?是的,你完全正确。但是,现在,我必须实例化具体的实现,这不是很好的可维护性。为什么?您可以根据$request参数no,no,Denis;-)将另一个实现绑定到中间件中的接口我绑定的唯一位置是服务提供商。但是在我的例子中,我需要一个属性(添加在中间件中)来自我的绑定请求对象(请参阅我的主要问题中的注册方法),谢谢!你是说延期?没错我是说延期是的。谢谢但这是一种不好的做法吗?绝对不是。这就是IoC容器的工作原理,也是它的一个优势。
public function register()
{
    $request = $this->app->request;
}