Я пишу новый проект с laravel 5.1, и я хочу использовать шаблон репозитория, но я не могу понять, каков наилучший способ сделать это.
Я думал о:
public function save(User $user)
{
$user->save();
}
public function find($id)
{
return User::find($id);
}
А потом
$user = new User();
$user->email = '[email protected]';
$userRepo->save($user);
Таким образом, я работаю с моделью как DTO
И это супер легко и удобно, но тогда я буду зависеть от Eloquent.
Так что я думал об использовании массива вместо модели, вот так:
public function save(array $user)
{
User::save($user);
}
public function find($id)
{
return User::find($id)->toArray();
}
Но тогда его будет гораздо менее удобно использовать.
Можете ли вы объяснить мне, как лучше всего использовать репозиторий в Laravel, чтобы я мог легко изменить источник данных в будущем, но все же будет удобно использовать этот шаблон?
Я настроил это следующим образом, используя ваш пример:
<?php namespace Repositories;
use Models\User;
class UserEloquentRespository implements UserInterface {
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function create($input)
{
$this->user->create($input);
}
}
Тогда в моем контроллере
Ларавел 4
<?php namespace Controllers;
use Repositories\UserInterface as User;
class UsersController extends \BaseController {
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function store()
{
$input = \Input::all();
// validation here
// now create your user
$user = $this->user->create($input);
if ($user) {
// redirect or do whatever you do on successful user creations
}
// Here you can do whatever you do if a user wasn't created for whatever reason
}
}
Ларавел 5
<?php namespace App\Http\Controllers;
use Repositories\UserInterface as User;
use App\Http\Requests\UserRequestForm;
use App\Http\Controllers\Controller;
class UsersController extends Controller {
protected $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function store(UserRequestForm $request)
{
// Form request validates in middleware
// now create your user
$user = $this->user->create($request->input());
if ($user) {
// redirect or do whatever you do on successful user creations
}
// Here you can do whatever you do if a user wasn't created for whatever reason
}
}
Наконец, не забудьте связать свой интерфейс с вашим красноречивым хранилищем в качестве поставщика услуг.
App::bind(
'Repositories\UserRepositoryInterface',
'Repositories\Eloquent\UserEloquentRepository'
);
Теперь, когда вам нужно изменить реализацию, просто измените привязку на новый класс, реализующий ваш интерфейс.
Других решений пока нет …