Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 依赖注入不需要的服务_Php_Dependency Injection - Fatal编程技术网

Php 依赖注入不需要的服务

Php 依赖注入不需要的服务,php,dependency-injection,Php,Dependency Injection,假设我们正在使用依赖项注入,并在一些控制器中使用它 例如,Laravel或任何其他具有DI的框架(在本例中,PHP的语言并不重要) 假设我们有一个控制器: class UserController extends Controller { public function __construct(UserRepository $users, Mailer $mailer, Logger $logger) { $this->users = $users;

假设我们正在使用依赖项注入,并在一些控制器中使用它

例如,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

如果我尝试将依赖项注入“index”方法之类的方法,我该怎么做,因为如果我扩展同一个方法并需要不同的依赖项,PHP将崩溃,因为方法签名不相同

最好的处理方法是什么

如果我在单独的控制器中提取每个方法,我将不得不进行大量重复


谢谢

有几件事需要考虑:

  • 首先,在什么时候,不是所有依赖项都一直被使用并不重要。这不会导致任何可测量的性能损失,因为性能瓶颈通常是由I/O造成的
  • 但是,如果您的类包含许多依赖项,并且有许多依赖项仅在某些方法中使用,则可能表明类上的方法没有内聚性。这可能再次表明该类别违反了单一责任原则。换句话说,这个类可能太大,有多个职责,如果是这样的话,它应该被分成多个较小的类。围绕实体概念对类功能进行分组(例如
    UserController
    does)通常是SRP违规的原因。相反,更好的解决方案通常是围绕功能对类进行分组;e、 g.
    DeleteUserController
    PromoteUserController
    BlockUserController

我的意思是这两种方法都以$userId为例,但在UserController中我需要Logger服务,因此我不能将其作为参数添加到要注入的方法中-它将需要注入构造函数中,但这样,其他控制器方法可能不需要此服务。您需要将其注入构造函数或为其创建新方法。真的没有办法解决这个问题。如果该方法与父方法具有不同的依赖项/签名,则无论哪种方法都应该是它自己的方法。“最佳方法”以什么客观指标衡量?谢谢,一个问题是测试-我必须提供所有依赖项或4个模拟对象来测试一个方法,即使它只使用了1个依赖项。但最终可能问题并不大。有一些模式可以帮助你简化测试。比如,看看这个。但是,如果类的方法没有内聚性,则表明该类违反了单一责任原则。谢谢,这样做可以吗(logger=di('logger'))-di是从容器返回logger对象的全局函数,或者这是一种不好的做法,这似乎是服务定位器反模式的变体。