【问题标题】:Do Symfony2 Services Always Need to be Declared in a Bundle?Symfony2 服务是否总是需要在捆绑中声明?
【发布时间】:2012-02-08 00:30:03
【问题描述】:

在 Symfony2 中,服务被定义为 [emphasis mine]:

服务是任何 PHP 对象的通用术语,它执行 具体任务。服务通常用于“全局”,例如 数据库连接对象或传递电子邮件的对象。 在 Symfony2 中,服务通常是从 服务容器。具有许多解耦服务的应用程序是 据说遵循面向服务的架构。

以“全局”为关键词,我看到的所有关于如何定义服务的示例都在现有捆绑包中声明了服务?这是来自MartinSikora.com的示例

<?php
    // Bundle/HelloBundle/Services/MyService.php
    namespace Bundle\HelloBundle\Services;

    class MyService {

        public function sum($n1, $n2) {
            return $n1 + $n2;
        }

    }
?>

然后他在 Hello 控制器中使用它:

<?php
// Bundle/HelloBundle/Controller/HelloController.php
namespace Bundle\HelloBundle\Controller;

class HelloController extends Controller {

    public function indexAction() {
        $number = $this->get('my_service')->sum(12, 37);
        // this returns 49

        /*
        ...
        */
    }
}
?>

注意他的示例服务是如何在 HelloBundle 包中标有“Services”的文件夹中声明的。如果将“服务”文件夹存储在任何特定捆绑包之外的一个或多个更高级别,因为服务旨在在整个应用程序中使用,那不是更好吗?

  • 这里的最佳做法是什么?
  • 该服务是否仅适用于 HelloBundle Bundle 中的控制器?
  • 为什么通常这样做?

【问题讨论】:

    标签: php model-view-controller symfony bundle


    【解决方案1】:

    简答
    不,服务不需要在包中定义。实际的服务类可能存在也可能不存在于捆绑包中——它们可能存在于供应商库文件夹中(或其他任何地方)。服务定义虽然通常在捆绑包的 Resources\config\services.yml 中定义,但也可以在 app/config.yml 中的 services 键下定义。

    服务只是一个在 Symfony 的依赖注入容器中注册的类。类本身可以存在于任何地方。

    长答案
    了解 Symfony2 中捆绑包的用途很重要。您的大部分项目(主要例外是 3rd 方库)由捆绑包组成。有些人喜欢将所有东西放在一个巨大的捆绑包中,但我更喜欢将它们用作特定功能的容器(即:用户管理、博客文章管理、资产管理。)

    因为包应该代表一种功能,所以在包中定义一些服务是有意义的。例如,在BlogPostBundle 中定义BlogPostEntityService 类是很自然的。现在,仅仅因为服务包含在一个包中,并不会降低它的全球性。如果我将我的服务注册为blog_bundle.blog_post_entity_service,我仍然可以从任何其他捆绑包中访问它。

    在 Martin 的示例中,MyService 是一个模糊的示例 - 它不像 BlogPostEntityService 那样具体。但是,您很可能会创建实用服务(即ArrayUtilService),在这种情况下,您可能希望创建一个UtilBundle 并将服务存储在那里。

    这里的最佳做法是什么?

    没有明确的答案 - 由您决定在哪里存储服务类。问问自己,服务是否直接处理你的包所代表的功能——如果是这样,它很可能属于包。如果您计划共享或重用您的捆绑包,这也是有意义的。

    该服务是否仅对 HelloBundle 中的控制器可用 捆绑?

    没有。您可以从任何控制器(或任何container 感知类)中调用该服务。您还可以将MyService 注入到任何其他服务中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2013-12-29
      • 2014-03-07
      相关资源
      最近更新 更多