1

У нас есть два типа хранилищ в нашем приложении:Laravel IoC переплеты с несколькими вариантами использования

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

Они оба реализуют один и тот же контракт PostRepositoryInterface.

Мой вопрос:

В основном мы будем использовать Database\PostRepository, чтобы получить наши сущности, хотя мы хотим использовать ElasticSearch\PostRepository в некоторых случаях:

  • Когда мы вернемся большие коллекции
  • При поиске по полнотекстовым запросам

Как мы можем обойти наша привязка к сервису по умолчанию: PostRepositoryInterface >> Database\PostRepository, в случаях, когда мы хотим использовать наши репозитории ElasticSearch?

У меня есть чувство, зависящее непосредственно от нашего бетона. Реализация не является отличной идеей.

+0

проверить поставщиков и документацию IoC на laravel. Вы можете переключать привязку во время выполнения. – anwerj

+0

Конечно, хотя это не столько переключение во время выполнения. Скорее, он всегда вызывается в этом месте – AndrewMcLagan

+0

Например, мы ВСЕГДА хотим использовать его в некоторых КОНТРОЛЛЕРАХ и других классах – AndrewMcLagan

ответ

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

Таким образом, когда вам нужно переключить вызов базы данных переключатель метод перед запросом. Eloquent будет писать запрос на основе соединения, если ORM поддерживает его.