【发布时间】:2019-10-23 13:01:52
【问题描述】:
假设我们正在使用一些依赖注入,并且我们在一些控制器中使用它。
例如 Laravel 或任何其他具有 DI 的框架(在这种情况下与 PHP 无关)。
假设我们有这个控制器:
class UserController extends Controller
{
public function __construct(UserRepository $users, Mailer $mailer, Logger $logger)
{
$this->users = $users;
$this->mailer = $mailer;
$this->logger = $logger;
}
public function method1(){...}
public function method2(){...}
public function index(UserRepository $users){...}
}
每个人都说这是个好设计,但我的问题是:
如果控制器调用 method1 并且它仅使用 mailer,那么构造具有所有 3 个依赖项的对象有什么意义。即使不占用大量内存或性能,这不是最优的吗?
有人会认为这个控制器需要所有这些,但实际上如果我只调用 method1,它只需要 mailer。 p>
如果我尝试在“index”方法之类的方法上注入依赖项,我该怎么做,因为如果我扩展相同的方法并需要不同的依赖项,PHP 会因为方法签名不同而崩溃。
处理此问题的最佳方法是什么。
如果我在单独的控制器中提取每个方法,我将不得不做很多重复。
谢谢
【问题讨论】:
-
我的意思是这两种方法都以 $userId 为例,但在 UserController 我需要 Logger 服务,所以我不能将它作为参数添加到要注入的方法中 - 它需要在构造函数中注入,但是这样,其他控制器方法中可能不需要此服务。
-
你要么需要在构造函数中注入它,要么为它创建一个新方法。真的没有办法解决这个问题。如果该方法与父方法具有不同的依赖项/签名,则无论哪种方式,它都应该是它自己的方法。
-
“最佳方式”的客观指标是什么?