Я начал работать с репозиториями в Laravel и столкнулся с ситуацией, когда я не уверен, правильно ли я делаю это …
Репозиторий пользователя:
interface UserRepositoryInterface
{
public function findByID(int $user_id);
public function load(User $user, array $relations);
}
class UserRepository implements UserRepositoryInterface
{
public function findByID(int $user_id)
{
return User::find($user_id);
}
public function load(User $user, array $relations)
{
$user->load($relations);
}
}
Клиентский базовый контроллер:
protected $user_repository, $client;
class Controller extends BaseController
{
public function __construct(Request $request, UserRepositoryInterface $user_repository)
{
$this->user_repository = $user_repository;
$this->client = $this->user_repository->findByID($request->route('client_id'));
}
}
Некоторое расширение клиентского базового контроллера:
use App\Http\Controllers\...\Controller as ClientsController;
class SomeController extends ClientsController
{
public function index()
{
$this->user_repository->load($this->client, ['addresses', 'bank_accounts', 'etc']);
return $this->client;
}
}
Хотя функции index () действительно показывают клиента со связанными моделями, мне кажется, что мой подход неправильный, но, если у меня уже есть клиент, то более естественным будет загрузить отсутствующие связанные модели, чем выполнить вызов ниже (где я получаю пользователь снова):
$this->client = $this->user_repository->findByIDWithRelations($user_id, ['...']);
Поскольку функция load () в хранилище ничего не возвращает, и я ничего не назначаю в функции index (), это как-то кажется фальшивым … Кто-нибудь может подтвердить или опровергнуть это?
Обновить:
Возьмите для примера этот фрагмент кода ниже (не работает):
function addToArray($array, $value)
{
array_push($array, $value);
}
$array = ['a', 'b', 'c'];
addToArray($array, 'd');
foreach($array as $value)
{
echo $value;
}
То, как я подошел к этому в Laravel, кажется очень похожим, и я чувствую, что это неправильно :-).
Хотя в этом разделе могут быть разные мнения, уже есть некоторые самоуверенные пакеты с открытым исходным кодом, которые предоставляют простую, но интуитивно понятную реализацию репозиториев для Laravel, которая позволяет вам использовать, например, следующий синтаксис:
$repository->with(['relationship']);
Так что ваш репозиторий является чистым, все отношения загружаются лениво, если вы не вызываете with
метод и передать массив, чтобы нетерпеливо загрузить некоторые отношения. API следующего пакета довольно прост & интуитивно, и я думаю, что это поможет вам в вашем подходе.
Проверять, выписываться: https://github.com/rinvex/repository/
Других решений пока нет …