Php 使用存储库加载Laravel

Php 使用存储库加载Laravel,php,laravel,repository,lazy-loading,eager-loading,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 {

我开始在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);
    }
}
客户端基本控制器:

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'));
    }
}
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;
    }
}
客户端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'));
    }
}
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()函数确实向客户机显示了相关模型,但感觉我的方法是错误的,但既然我已经有了客户机,那么加载缺失的相关模型,然后执行以下调用(在这里我再次获取用户)就更自然了:

因为存储库中的load()函数不返回任何内容,而我在index()函数中也没有分配任何内容,所以不知何故,它看起来是假的。。。有人能证实或否认这一点吗

更新:

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


我在Laravel中处理这个问题的方式感觉非常相似,这让我觉得这是错误的:-)。

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

$repository->with(['relationship']);
因此,您的存储库是干净的,所有关系都是延迟加载的,除非您使用方法调用
,并传递数组以加载一些关系。以下软件包的API非常简单和直观,我认为它将帮助您实现这一方法


签出:

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

$repository->with(['relationship']);
因此,您的存储库是干净的,所有关系都是延迟加载的,除非您使用
方法调用
,并传递数组以加载一些关系。以下软件包的API非常简单和直观,我认为它将帮助您实现这一方法

结帐: