我们的应用程序中有两种类型的存储库:
App\Repositories\Database\PostRepository
App\Repositories\ElasticSearch\PostRepository
他们都实施相同的合同PostRepositoryInterface
。
我的问题是:
我们通常会使用Database\PostRepository
来检索我们的实体,但我们希望在某些情况下使用ElasticSearch\PostRepository
:
在我们想要实际使用ElasticSearch存储库的情况下,我们如何解决我们的默认服务绑定:PostRepositoryInterface >> Database\PostRepository
?
我觉得直接依赖于我们具体的ElasticSearch\PostRepository
实现并不是一个好主意。
答案 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将根据连接编写查询。