Laravel/Lumen 根据用户输入在中间件上绑定接口
Laravel/Lumen bind interface on middleware based on user input
我对此很陌生,所以请多多包涵。 :)
我有一个接口的 2 个实现,我们将它们命名为 BankService1
和 BankService2
,它们都遵循 DisbursementInterface
.
通常,如果我只需要一个实现,我会在 bootstrap/app.php
中绑定接口和实现,并将接口注入控制器的构造函数。但是,我想根据用户输入动态绑定实现,如下所示:
//if remittance is true, use bank 1 else bank 2
$disbursementService = ($request['remittance'] ? 'BankService1' : 'BankService2');
$this->app->bind('My\Namespace\DisbursementInterface', "My\Namespace\{$disbursementService}");
我认为中间件是执行此操作的最佳位置,因为我需要 $request
对象。但是我很难绑定实现,因为就像我说的那样,我在这方面还是很陌生。
有什么建议吗?
我明白了。我真正需要的只是创建一个服务容器!我实际上根本不需要它在中间件中。
class DisbursementServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton(DisbursementInterface::class, function($app) {
if ($this->app->request->remittance) {
return new BankService1();
}
return new BankService2();
});
}
}
之后,我在 bootstrap/app.php
中注册了我的服务容器,现在可以使用了!我现在可以根据用户输入在实现之间切换 :)
我对此很陌生,所以请多多包涵。 :)
我有一个接口的 2 个实现,我们将它们命名为 BankService1
和 BankService2
,它们都遵循 DisbursementInterface
.
通常,如果我只需要一个实现,我会在 bootstrap/app.php
中绑定接口和实现,并将接口注入控制器的构造函数。但是,我想根据用户输入动态绑定实现,如下所示:
//if remittance is true, use bank 1 else bank 2
$disbursementService = ($request['remittance'] ? 'BankService1' : 'BankService2');
$this->app->bind('My\Namespace\DisbursementInterface', "My\Namespace\{$disbursementService}");
我认为中间件是执行此操作的最佳位置,因为我需要 $request
对象。但是我很难绑定实现,因为就像我说的那样,我在这方面还是很陌生。
有什么建议吗?
我明白了。我真正需要的只是创建一个服务容器!我实际上根本不需要它在中间件中。
class DisbursementServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->singleton(DisbursementInterface::class, function($app) {
if ($this->app->request->remittance) {
return new BankService1();
}
return new BankService2();
});
}
}
之后,我在 bootstrap/app.php
中注册了我的服务容器,现在可以使用了!我现在可以根据用户输入在实现之间切换 :)