【问题标题】:Laravel IoC bindings with multiple use casesLaravel IoC 绑定多个用例
【发布时间】:2017-05-25 19:36:48
【问题描述】:

我们的应用程序中有两种类型的存储库:

  • App\Repositories\Database\PostRepository
  • App\Repositories\ElasticSearch\PostRepository

他们都执行相同的合约PostRepositoryInterface

我的问题是:

大多数情况下,我们将使用Database\PostRepository 来检索我们的实体,尽管在某些情况下我们希望使用ElasticSearch\PostRepository

  • 当我们返回大量收藏时
  • 通过全文查询搜索时

如果我们想实际使用我们的 ElasticSearch 存储库,我们如何绕过我们的默认服务绑定:PostRepositoryInterface >> Database\PostRepository

我觉得直接依赖于我们具体的ElasticSearch\PostRepository 实现并不是一个好主意。

【问题讨论】:

  • 在 laravel 上查看提供者和 IoC 文档。您可以在运行时切换绑定。
  • 当然可以,虽然在运行时并没有那么多切换。相反,它总是在那个位置被调用
  • 例如我们总是想在一些控制器和其他类中使用它

标签: php laravel model-view-controller dependency-injection interface


【解决方案1】:

如果您使用具有不同案例的不同应用程序,基于存储库的抽象可以为您提供帮助,您希望有一些模型可以从一个数据库调用,而另一个用于其他数据库。

因为不能在运行时切换repository,所以需要切换model。

假设您有一个存储库。

// YOUR REPO FILE
use App\Models\ElasticPostModel;
use App\Models\DatabasePostModel;
PostRepository extends SomeRepo implements SomeInterface{
    public function __construct(<Inject Both Models>){
        $this->databaseModel = $databaseModel;
        $this->elasticModel = $elasticModel;

        // You may want to set default model here;
        $this->model = $databaseModel;
    }

    public function switch($type = 'database'){
        if($type == 'elastice')
            $this->model = $this->elasticModel;
        else
            $this->model = $this->databaseModel;
    }

}

// SPECIFY CONNECTION IN ELASTIC MODEL
ElasticPostModel extends Model{
    protected $connection = 'elastic';
}

// ADD CONNECTION DETAILS IN config/db.php

'elastic' => [
    'driver' => 'elastic'
]

这种方式当需要切换数据库时,在查询前调用switch方法。如果 ORM 支持,Eloquent 将根据连接编写查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2019-10-10
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多