Laravel懒得急切加载存储库

时间:2016-06-03 09:58:49

标签: php laravel repository lazy-loading eager-loading

我开始在Laravel中处理存储库,遇到了一种情况,我不确定我是否正确地处理这个问题......

用户存储库:

interface UserRepositoryInterface
{
    public function findByID(int $user_id);
    public function load(User $user, array $relations);
}

class UserRepository implements UserRepositoryInterface
{
    public function findByID(int $user_id)
    {
        return User::find($user_id);
    }
    public function load(User $user, array $relations)
    {
        $user->load($relations);
    }
}

客户端basecontroller:

protected $user_repository, $client;

class Controller extends BaseController
{
    public function __construct(Request $request, UserRepositoryInterface $user_repository)
    {
        $this->user_repository = $user_repository;
        $this->client = $this->user_repository->findByID($request->route('client_id'));
    }
}

客户端basecontroller的一些扩展:

use App\Http\Controllers\...\Controller as ClientsController;

class SomeController extends ClientsController
{
    public function index()
    {
        $this->user_repository->load($this->client, ['addresses', 'bank_accounts', 'etc']);
        return $this->client;
    }
}

虽然index()函数确实向客户端显示了相关模型,但感觉我的方法是错误的,但是我已经有了客户端,加载缺少的相关模型然后在下面进行调用时感觉更自然(其中)我再次获取用户):

$this->client = $this->user_repository->findByIDWithRelations($user_id, ['...']);

因为存储库中的load()函数没有返回任何内容并且我在index()函数中没有任何内容,所以它会以某种方式感觉到伪造......有人可以确认或否认这个吗?

更新

以下面这段代码为例(不起作用):

function addToArray($array, $value)
{
    array_push($array, $value);
}

$array = ['a', 'b', 'c'];

addToArray($array, 'd');

foreach($array as $value)
{
    echo $value;
}

我在Laravel中接触这种方式的感觉非常相似,这让我觉得它错了: - )。

1 个答案:

答案 0 :(得分:0)

虽然这个主题可能有不同的意见,但已经有一些固定的开源软件包为Laravel提供了一个简单但直观的存储库实现,允许您使用以下语法,例如:

$repository->with(['relationship']);

为了使您的存储库干净,所有关系都是延迟加载的,除非您调用with方法并传递数组以急切加载某些关系。以下包的API非常简单&直观,我认为这将有助于你的方法。

结帐:https://github.com/rinvex/repository/