2015-11-20 3 views
0

Я использую Laravel 5.1 и настроил шаблон репозитория. У меня есть конкретные реализации моих репозиториев, введенных в мои контроллеры. Я понимаю, что ваш SUPPOSED для внедрения интерфейса, но это усложняет мой API и не решает проблему. У меня есть клиентский конфиг, который просто содержит строку, такую ​​как '', и я уже использую эту глобальную версию для переопределения моделей, если они существуют.Laravel - Определение переопределений репозитория

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

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

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

ответ

1

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

Пример конфигурации (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 пользователя модель непосредственно:

<?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 ...)

 Смежные вопросы

  • Нет связанных вопросов^_^