Laravel DI 耦合差异
Laravel DI coupling differences
如果使用这 3 种用法,class 耦合有什么不同:
案例一
use UserRepository
...
UserRepository::getUser();
案例二
App::make('UserRepository')->getUser();
案例三
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
...
$this->userRepository->getUser();
有什么理由比另一个更喜欢一个吗?
编辑
我觉得构造函数选项似乎是最好的方法,但是当我需要在控制器中包含 3 个服务和 3 个存储库时,我发现自己有问题,然后很快在构造函数中升级到 6 个参数。
编辑 - 案例 4
当您改用外观时怎么办?
编辑 - 案例 5
如果指定为\UserRepository
呢?
首先,存储库的想法是有一个接口(UserRepositoryInterface)和实现它的classes(MySQLUserRepository,RedisUserRepository)。它为您提供了一种通过调用接口通过 DI 容器更改用户存储的快速方法:
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
并将其更改为 DI 容器中的任何实现。
假设您有一个包含 10 个操作的控制器。
案例1不是OOP方式,因为调用根本不走DI容器
Case 2实际上是可以的,但是你必须在每个动作中调用App facade。真的不美
案例 3 只给你一个地方 create/change/configure class。
例如你需要做类似的事情:
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
$this->userRepository->excludeAdmins();
}
constructor 中的很多存储库实际上是可以的,但是如果代码对您来说很恶心,您可以将其提取到服务中 class。
更新
服务 class 我的意思是 class 不扩展任何内容并包含业务逻辑。
进一步阅读:https://m.dotdev.co/design-pattern-service-layer-with-laravel-5-740ff0a7b65f
案例 4。在我看来,立面适用于更全球化的事物。为什么要用外观填充每个存储库?太费时间了。
案例 5。没听懂问题。你的意思是把它放到根命名空间?它有什么变化?
如果使用这 3 种用法,class 耦合有什么不同:
案例一
use UserRepository
...
UserRepository::getUser();
案例二
App::make('UserRepository')->getUser();
案例三
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
}
...
$this->userRepository->getUser();
有什么理由比另一个更喜欢一个吗?
编辑
我觉得构造函数选项似乎是最好的方法,但是当我需要在控制器中包含 3 个服务和 3 个存储库时,我发现自己有问题,然后很快在构造函数中升级到 6 个参数。
编辑 - 案例 4
当您改用外观时怎么办?
编辑 - 案例 5
如果指定为\UserRepository
呢?
首先,存储库的想法是有一个接口(UserRepositoryInterface)和实现它的classes(MySQLUserRepository,RedisUserRepository)。它为您提供了一种通过调用接口通过 DI 容器更改用户存储的快速方法:
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
并将其更改为 DI 容器中的任何实现。
假设您有一个包含 10 个操作的控制器。
案例1不是OOP方式,因为调用根本不走DI容器
Case 2实际上是可以的,但是你必须在每个动作中调用App facade。真的不美
案例 3 只给你一个地方 create/change/configure class。
例如你需要做类似的事情:
public function __construct(UserRepository $userRepository)
{
$this->userRepository = $userRepository;
$this->userRepository->excludeAdmins();
}
constructor 中的很多存储库实际上是可以的,但是如果代码对您来说很恶心,您可以将其提取到服务中 class。
更新 服务 class 我的意思是 class 不扩展任何内容并包含业务逻辑。
进一步阅读:https://m.dotdev.co/design-pattern-service-layer-with-laravel-5-740ff0a7b65f
案例 4。在我看来,立面适用于更全球化的事物。为什么要用外观填充每个存储库?太费时间了。
案例 5。没听懂问题。你的意思是把它放到根命名空间?它有什么变化?