【问题标题】:Dependency Injection vs Static依赖注入与静态
【发布时间】:2015-03-17 14:42:32
【问题描述】:

我正在学习 symfony 框架,我想知道: 如果我需要像助手这样的东西(例如),是制作服务更好(在我的控制器中进行依赖注入)还是创建静态函数更好。 每种方法的优缺点是什么。

提前谢谢你:)

【问题讨论】:

    标签: php symfony code-injection


    【解决方案1】:

    这是一个非常重要的问题,关于添加执行非常特定过程的可重用库的最佳方法。

    Symfony 的方式是把它变成一个服务并注册到服务容器中。

    <?php 
    
    namespace Acme\MainBundle\Services;
    
    class MobileHelper
    {
        public function formatMobile($number)
        {
            $ddd = substr($number, 0, 2);
            $prefix_end_index = strlen($number) == 11 ? 5 : 4;
            $prefix = substr($number, 2, $prefix_end_index);
            $suffix = substr($number, -4, 4);
    
            return sprintf('(%s) %s-%s', $ddd, $prefix, $suffix);
        }
    
        public function unformatMobile($number)
        {
            $number = preg_replace('/[()-\s]/', '', $number);
    
            return $number;
        }
    }
    

    然后在 services.yml 上

      mobile.helper:
        class: Acme\MainBundle\Services\MobileHelper
    

    然后你可以在你的控制器中使用它:

    $mobileHelper = $this->get('mobile.helper');
    $formattedMobile = $mobileHelper->formatMobile('11999762020');
    

    【讨论】:

    • 好吧,我似乎很清楚 :) 但是有没有解释为什么服务(就像你在顶部所做的那样)比包含静态方法的静态类更好。然后这些方法将在我们的控制器中像 MobileHelper::formatMobile('11999762020') 一样被调用。
    • @hornfl4kes 通过使用静态类,您可以将其紧密耦合到控制器中,而通过使用 DI,您可以键入提示接口,而不必担心控制器中的特定实现。请注意,上面的代码严格来说不是依赖注入,而是使用了服务定位器。
    • @hornfl4kes 在这个例子中,没有理由在服务中注入服务容器或实体管理器,但是当您需要访问另一个服务甚至实体管理器时,最好将它们注入构造函数而不是使用一组 symfony 内核调用来加载其他依赖项。检查symfony.com/doc/current/book/service_container.html
    【解决方案2】:

    Controllers 中的静态函数看起来不像是 Symfony 的做事方式。服务和依赖注入往往是一种方式,因为它立即将功能与单个控制器分离,并使其更容易重用。认为这种方法可能还会提高您关于如何构建该服务的逻辑。 Symfony 最佳实践适用于轻量级控制器,因此任何繁重的业务逻辑都应移出到服务中。

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多