登录Laravel后绑定到实现的接口

问题描述 投票:0回答:1

用户登录到应用程序后,我需要执行一个接口来实现绑定。登录时,用户选择一个环境,并根据该环境执行绑定。我已将以下绑定添加到AppServiceProvider,但似乎在执行登录之前已将其引导。

$providerClass  = 'App\Models\\' . ucfirst($provider);

        $this->app->bind(
            'App\Repositories\MyRepository',
            $providerClass
        );

是否有可能从控制器绑定此对象,或者将是根据用户选择的环境将接口绑定到相应实现的替代方法?

php laravel inversion-of-control
1个回答
0
投票

正如@PtrTon所说,尽管这是一个创意,但这是一个坏主意。您可以在此处考虑laravel寄存器模式。

注册表类:

class EnvironmentGatewayRegistry {

  protected $gateways = [];

  function register ($name, EnvironmentGateway $instance) {
    $this->gateways[$name] = $instance;
    return $this;
  }

  function get($name) {
    if (in_array($name, $this->gateways)) {
      return $this->gateways[$name];
    } else {
      throw new Exception("Invalid gateway");
    }
  }

}

您的服务提供商

$this->app->singleton(EnvironmentGatewayRegistry::class);

$this->app->make(EnvironmentGatewayRegistry::class)
      ->register("dev", new DevImplemetaionClass())
      ->register("prod", new ProdImplemetaionClass());

在您的控制器/您想要的任何地方,您都可以注入类EnvironmentGatewayRegistry并以诸如devprod作为寄存器名称的参数调用get方法。

[更多参考,请检查此文件http://rizqi.id/laravel-registry-pattern

© www.soinside.com 2019 - 2024. All rights reserved.