【问题标题】:Laravel Repository Pattern Best PracticeLaravel 存储库模式最佳实践
【发布时间】:2015-11-23 22:39:30
【问题描述】:

我正在使用 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 中使用存储库的最佳方式是什么,以便我将来能够轻松更改数据源,但使用这种模式仍然很舒服?

【问题讨论】:

  • 如果将逻辑放入模型中,存储库的意义何在?
  • @Federico 我在这个存储库中使用 eloquent,但在实现相同接口的其他存储库中我将使用其他东西,例如文件源,但我仍然可以将模型用作 DTO .
  • @Federico 如果不清楚的话,这段代码在存储库文件中,而不是在模型中

标签: php laravel repository repository-pattern repository-design


【解决方案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);
  }
}

然后在我的控制器中

Laravel 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

  }

}

Laravel 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'
    );

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2015-04-16
    • 2012-04-01
    相关资源
    最近更新 更多