Php Laravel存储库模式最佳实践

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

我正在用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->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'
    );