Php 具有多个用例的Laravel IoC绑定
我们的应用程序中有两种类型的存储库:Php 具有多个用例的Laravel IoC绑定,php,laravel,model-view-controller,dependency-injection,interface,Php,Laravel,Model View Controller,Dependency Injection,Interface,我们的应用程序中有两种类型的存储库: App\Repositories\Database\PostRepository App\Repositories\ElasticSearch\PostRepository 它们都实现相同的契约PostRepositoryInterface 我的问题是: 虽然我们希望在某些情况下使用ElasticSearch\PostRepository,但我们通常会使用Database\PostRepository检索实体: 当我们归还大量藏品时 通过全文查询进行搜
App\Repositories\Database\PostRepository
App\Repositories\ElasticSearch\PostRepository
PostRepositoryInterface
我的问题是:
虽然我们希望在某些情况下使用ElasticSearch\PostRepository
,但我们通常会使用Database\PostRepository
检索实体:
- 当我们归还大量藏品时
- 通过全文查询进行搜索时
PostRepositoryInterface>>Database\PostRepository
我觉得直接依赖于我们具体的
ElasticSearch\PostRepository
实现并不是一个好主意。基于存储库的抽象可以帮助您,如果您在不同的情况下使用不同的应用程序,您希望从一个数据库调用一些模型,然后从另一个数据库调用另一个数据库
因为不能在运行时切换存储库,所以需要切换模型
假设您只有一个存储库
// 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'
]
//您的REPO文件
使用App\Models\ElasticPostModel;
使用App\Models\DatabasePostModel;
PostRepository扩展了SomeRepo实现了SomeInterface{
公共函数构造(){
$this->databaseModel=$databaseModel;
$this->elasticModel=$elasticModel;
//您可能需要在此处设置默认模型;
$this->model=$databaseModel;
}
公用函数开关($type='database'){
如果($type=='elastice')
$this->model=$this->elasticModel;
其他的
$this->model=$this->databaseModel;
}
}
//在弹性模型中指定连接
ElasticPostModel扩展模型{
受保护的$连接='弹性';
}
//在config/db.php中添加连接详细信息
“弹性”=>[
“驱动程序”=>“弹性”
]
当您需要在查询之前切换数据库调用switch方法时,使用这种方法。如果ORM支持,Eloquent将基于连接编写查询。基于存储库的抽象可以帮助您,如果您在不同的情况下使用不同的应用程序,您希望从一个数据库调用一些模型,从另一个数据库调用一些模型 因为不能在运行时切换存储库,所以需要切换模型 假设您只有一个存储库
// 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'
]
//您的REPO文件
使用App\Models\ElasticPostModel;
使用App\Models\DatabasePostModel;
PostRepository扩展了SomeRepo实现了SomeInterface{
公共函数构造(){
$this->databaseModel=$databaseModel;
$this->elasticModel=$elasticModel;
//您可能需要在此处设置默认模型;
$this->model=$databaseModel;
}
公用函数开关($type='database'){
如果($type=='elastice')
$this->model=$this->elasticModel;
其他的
$this->model=$this->databaseModel;
}
}
//在弹性模型中指定连接
ElasticPostModel扩展模型{
受保护的$连接='弹性';
}
//在config/db.php中添加连接详细信息
“弹性”=>[
“驱动程序”=>“弹性”
]
当您需要在查询之前切换数据库调用switch方法时,使用这种方法。如果ORM支持,Eloquent将基于连接编写查询。查看laravel上的提供者和IoC文档。您可以在运行时切换绑定。当然,虽然在运行时切换不多。相反,它总是在那个位置被调用。例如,我们总是想在一些控制器和其他类中使用它。在laravel上检查提供者和IoC文档。您可以在运行时切换绑定。当然,虽然在运行时切换不多。相反,它总是在那个位置被调用。例如,我们总是想在一些控制器和其他类中使用它