Php 修饰存储库的Laravel接口注入

Php 修饰存储库的Laravel接口注入,php,laravel,laravel-4,Php,Laravel,Laravel 4,为了提供从模型中获取数据的不同层,我一直在遵循关于装饰存储库的非常有用的内容 在实现它的过程中,我为我的客户机模型创建了两个存储库,它们都实现了ClientRepository接口(缓存repo和db repo) 然后我创建了一个服务提供商,并相应地注册了它们 以同样的方式,我为FxRateRepository做了同样的事情。以下是进行注册的服务提供商: // Providers/DatabaseServiceProvider public function register() {

为了提供从模型中获取数据的不同层,我一直在遵循关于装饰存储库的非常有用的内容

在实现它的过程中,我为我的
客户机
模型创建了两个存储库,它们都实现了
ClientRepository
接口(缓存repo和db repo)

然后我创建了一个服务提供商,并相应地注册了它们

以同样的方式,我为
FxRateRepository
做了同样的事情。以下是进行注册的服务提供商:

// Providers/DatabaseServiceProvider

public function register()
{
    // Register the fx repositories
    $this->app->singleton('\repositories\FxRateRepository', function()
    {
        return new CacheFxRateRepository(new DbFxRateRepository);
    });

    // Register the client repositories
    $this->app->singleton('\repositories\ClientRepository', function()
    {
        return new CacheClientRepository(new DbClientRepository);
    });
}
现在这一切都很好,运作良好。。。直到我意识到我的
DbClientRepository
需要
FxRateRepository
的实例。在我的服务提供者中,我“新建”每个repo的一个实例,并将它们作为依赖项传递给父repo

显然,我无法将接口传递到
DbClientRepository
,那么我如何告诉Laravel将
FxRateRepository
的实现注入我的
DbClientRepository

我尝试在
DbClientRepository
的构造函数中键入暗示,但出现了一个异常:

class DbClientRepository implements ClientRepository {
  private $fxRepo;
  public function __construct(FxRateRepository $fxRepo)
  {
      $this->fxRepo = $fxRepo;
  }
}
参数1传递到存储库\DbClientRepository::\uu构造() 必须是repositories\FxRateRepository的实例,未指定任何实例


我可能错过了IoC容器的一些便利功能,但如果您能就如何实现这一点提供任何建议,我将不胜感激。

Type暗示
DbClientRepository的构造函数中的依赖关系是正确的,但是,您不能仅通过
new DbClientRepository
实例化它,而必须使用
App::make()
从IoC容器中解析它,以便Laravel能够处理DI:

$this->app->singleton('\repositories\ClientRepository', function()
{
    return new CacheClientRepository(App::make('repositories\DbClientRepository');
});
您也可以使用
$app
对象来代替外观:

$this->app->singleton('\repositories\ClientRepository', function($app)
{
    return new CacheClientRepository($app->make('repositories\DbClientRepository');
});