我一直在关注真正有帮助的Laracast装饰存储库以提供从模型获取数据的不同层。
在实现它时,我为我的 Client
模型创建了 2 个存储库,它们都实现了 ClientRepository
接口(interface)(一个缓存存储库和一个数据库存储库)。
然后我创建了一个服务提供商并相应地注册了它们。
以同样的方式,我对 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
的实例。在我的服务提供商中,我“新建”每个存储库的一个实例,并将它们作为依赖项传递到父存储库中。
显然我无法将接口(interface)传递到 DbClientRepository
中,那么我如何告诉 Laravel 将 FxRateRepository
的实现注入(inject)到我的 DbClientRepository
中?
我尝试在 DbClientRepository
的构造函数中进行类型提示,但出现异常:
class DbClientRepository implements ClientRepository {
private $fxRepo;
public function __construct(FxRateRepository $fxRepo)
{
$this->fxRepo = $fxRepo;
}
}
Argument 1 passed to repositories\DbClientRepository::__construct() must be an instance of repositories\FxRateRepository, none given
我可能错过了 IoC 容器的一些方便的功能,但希望得到有关如何实现此目的的任何建议?
最佳答案
在 DbClientRepository
构造函数中类型提示的依赖关系是正确的,但是您不能仅通过 new DbClientRepository
实例化它,而必须从 IoC 解析它带有 App::make()
的容器,这样 Laravel 就可以处理 DI:
$this->app->singleton('\repositories\ClientRepository', function()
{
return new CacheClientRepository(App::make('repositories\DbClientRepository');
});
除了 Facade,您还可以使用 $app
对象:
$this->app->singleton('\repositories\ClientRepository', function($app)
{
return new CacheClientRepository($app->make('repositories\DbClientRepository');
});
关于php - 装饰存储库的 Laravel 接口(interface)注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28346922/