Laravel — Определение переопределений репозитория

Я использую Laravel 5.1 и настроил шаблон репозитория. У меня есть конкретные реализации моих репозиториев, введенные в мои контроллеры. Я понимаю, что вы ПРЕДЛАГАЕТЕ вводить интерфейс, но это усложняет мой API и не решает мою проблему. У меня есть клиентский конфиг, который просто содержит строку типа », и я уже использую ее глобально для использования переопределений моделей, если они существуют.

Так, например, если у меня есть клиент ‘yahoo’, и у него есть переопределение в моем Overrides / Yahoo / Models / User.php, тогда он будет использовать этот User.php. Независимо от того, является ли это расширением базовой модели User или совершенно новой реализацией, мне решать.

Я пытаюсь сделать то же самое для моих репозиториев. Я хочу иметь возможность поместить файл переопределения в Overrides / Yahoo / Repos / UserRepository.php и при внедрении он будет использовать базовый репозиторий пользователя или переопределение, если он существует.

Любые идеи о том, как я могу это сделать? Я понимаю, что вы можете внедрить интерфейс репозитория и использовать привязку, но я хочу сделать это глобально. Если вы можете сказать мне, как я могу абстрагировать эту функциональность, чтобы автоматически связывать правильную реализацию интерфейса на основе конфигурации клиента, я бы принял это.

0

Решение

Вы можете разрешить свою конкретную реализацию с помощью используемой конфигурации, но для этого необходимо использовать интерфейсы.

Пример конфигурации (config/client.php):

<?php

return [

'users' => [
'repository' => \App\Overrides\Yahoo\Repos\UserRepository::class,
],

];

В вашем AppServiceProviders register метод:

/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind(
UserRepositoryInterface::class,
config('client.users.repository')
);
}

В вашем Yahoo UserRepository вы можете напрямую внедрить модель Yahoo User:

<?php

namespace App\Overrides\Yahoo\Repos;

use App\Repos\UserRepositoryInterface;
use App\Overrides\Yahoo\Models\User;

class UserRepository implements UserRepositoryInterface
{

private $user;

public function __construct(User $user)
{
$this->user = $user;
}

// TODO: Implement UserRepositoryInterface methods

}

Наконец, в вашем UserController вы можете внедрить UserRepositoryInterface, и он будет привязывать конкретную реализацию на основе вашей конфигурации:

<?php

namespace App\Http\Controllers;

use App\Repos\UserRepositoryInterface;

class UserController extends Controller
{

private $users;

public function __construct(UserRepositoryInterface $users)
{
$this->users = $users;
}

}

Поначалу это может показаться излишним, но как только вы все настроите, добавить новые переопределения довольно просто.

Вы даже можете создать базовую конкретную реализацию UserRepository и сделать так, чтобы каждый переопределенный репозиторий наследовал от него. Таким образом, вам не нужно повторно реализовывать все методы, необходимые для интерфейса, но вы сохраняете гибкость, когда пользовательские репозитории используют различные технологии баз данных (SQL, MondoDB …)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]