php - 装饰存储库的 Laravel 接口(interface)注入(inject)

标签 php laravel laravel-4

我一直在关注真正有帮助的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/

相关文章:

php - 我正在尝试从 MySQL 查询生成一个 HTML 表。这是我试图从 MySQL 查询 : 生成的表的格式

laravel - 如何通过 Laravel Validation 检查上传的 PDF 是否加密

laravel - 只显示集合名称?

路由组上的 Laravel 过滤器,但仅在发布请求中

php - 通过带有列号的post请求选择MySQL限制列

php - 如何为我自己的插件使用 Joomla Ajax 界面

php - 为什么我无法取消设置 foreach 循环中通过引用传递的数组项?

找不到 PhpStorm laravel 5 方法

php - 无法使用 PHP 5.5 在 Ubuntu 14.04 上的 Laravel 4.2 中获得任何路由

php - 具有无限数量参数的 Laravel 4 路由