Laravel IoC绑定多个用例

时间:2017-01-11 05:54:45

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

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

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

他们都实施相同的合同PostRepositoryInterface

我的问题是:

我们通常会使用Database\PostRepository来检索我们的实体,但我们希望在某些情况下使用ElasticSearch\PostRepository

  • 当我们返回大型藏品时
  • 通过全文查询进行搜索时

在我们想要实际使用ElasticSearch存储库的情况下,我们如何解决我们的默认服务绑定:PostRepositoryInterface >> Database\PostRepository

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

1 个答案:

答案 0 :(得分:0)

基于存储库的抽象可以帮助您,如果您使用不同的情况下的不同应用程序,您希望从一个数据库调用某些模型,而其他模型调用其他模型。

因为您无法在运行时切换存储库,所以需要切换模型。

考虑您有一个存储库。

// 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'
]

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