Laravel/Lumen 根据用户输入在中间件上绑定接口

Laravel/Lumen bind interface on middleware based on user input

我对此很陌生,所以请多多包涵。 :)

我有一个接口的 2 个实现,我们将它们命名为 BankService1BankService2,它们都遵循 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 中注册了我的服务容器,现在可以使用了!我现在可以根据用户输入在实现之间切换 :)