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');
});