Php Laravel存储库模式最佳实践
我正在用Laravel5.1编写一个新项目,我想使用repository模式,但我不知道最好的方法是什么 我在想:Php Laravel存储库模式最佳实践,php,laravel,repository,repository-pattern,repository-design,Php,Laravel,Repository,Repository Pattern,Repository Design,我正在用Laravel5.1编写一个新项目,我想使用repository模式,但我不知道最好的方法是什么 我在想: public function save(User $user) { $user->save(); } public function find($id) { return User::find($id); } 然后 $user = new User(); $user->email = 'foo@bar.com'; $userRepo->sav
public function save(User $user)
{
$user->save();
}
public function find($id)
{
return User::find($id);
}
然后
$user = new User();
$user->email = 'foo@bar.com';
$userRepo->save($user);
这样的话,我就可以使用模型作为DTO
,它非常简单和舒适,但我将依赖于雄辩
所以我想用数组代替模型,就像这样:
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);
}
}
现在,每当您需要更改实现时,只需将绑定更改为实现接口的任何新类。如果您将该逻辑放入模型中,那么存储库的意义何在?@Federico我在该存储库中使用eloquent,但在实现同一接口的其他存储库中,我将使用其他内容,例如,一个文件源,但我仍然可以将模型用作
DTO
@Federico,如果不清楚,该代码在存储库文件中,而不是在模型中
<?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
}
}
<?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'
);