1

我正在用 laravel 5.1 编写一个新项目,我想使用存储库模式,但我不知道最好的方法是什么。

我在想:

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,它非常简单和舒适,但是我将依赖 Eloquent。

所以我正在考虑使用数组而不是模型,就像这样:

public function save(array $user)
{
    User::save($user);
}

public function find($id)
{
    return User::find($id)->toArray();
}

但是那样使用起来会不太舒服。

你能解释一下在 Laravel 中使用存储库的最佳方式是什么,以便我将来能够轻松更改数据源,但使用这种模式仍然很舒服?

4

1 回答 1

1

使用您的示例,我将其设置如下:

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

  }

}

最后,不要忘记将你的接口作为服务提供者绑定到你的 eloquent 存储库。

    App::bind(
        'Repositories\UserRepositoryInterface',
        'Repositories\Eloquent\UserEloquentRepository'
    );

现在,每当您需要更改实现时,只需将绑定更改为实现您的接口的任何新类。

于 2015-11-24T01:53:56.333 回答