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
检索实体:

  • 当我们归还大量藏品时
  • 通过全文查询进行搜索时
在实际使用ElasticSearch存储库的情况下,我们如何绕过默认的服务绑定:
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文档。您可以在运行时切换绑定。当然,虽然在运行时切换不多。相反,它总是在那个位置被调用。例如,我们总是想在一些控制器和其他类中使用它