在 Sylius/Symfony 中解析控制器服务

Resolving Controller Services in Sylius/Symfony

Hoes Symfony 将 Sylius 服务 sylius.controller.shop_user 服务解析到控制器 class 文件 Sylius\Bundle\UserBundle\Controller\UserController.

我的理解是sylius.controller.shop_user是一个服务,在Symfony中会有相应的服务配置。这个服务配置会告诉 Symfony 在需要实例化服务时使用哪个class。

但是,我似乎无法在任何地方的 Sylius 源配置中找到 sylius.controller.shop_user 配置。路由文件中仅引用了此服务

#File: src/Sylius/Bundle/ShopBundle/Resources/config/routing/ajax/user.yml
sylius_shop_ajax_user_check_action:
    path: /check
    methods: [GET]
    defaults:
        _controller: sylius.controller.shop_user:showAction
        _format: json
        _sylius:
            repository:
                method: findOneByEmail
                arguments:
                    email: $email
            serialization_groups: [Secured]

或在磁盘容器缓存文件中。

var/cache/dev/srcKernelDevDebugContainer.xml
1798:    <parameter key="sylius.controller.shop_user.class">Sylius\Bundle\UserBundle\Controller\UserController</parameter>
15230:    <service id="sylius.controller.shop_user" class="Sylius\Bundle\UserBundle\Controller\UserController" public="true">

那么 Symfony 如何知道为这个服务实例化正确的class?

是否有我没有看到的配置?自动生成 class 的一些 Symfony 魔法?其他一些神秘的第三件事,我不知道我不知道什么?

我心中没有任何具体任务,我只是想了解一下 Sylius 和 Symfony 的幕后工作原理。

控制器服务是根据Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\AbstractDriver::addController中ResourceBundle的配置定义的。加载包时调用此驱动程序。

名称为 sylius.controller.[entity-name] 的服务是 西利乌斯 entity resource system。据我所知,当您定义新的学说实体时 以特定的方式和 register them as a Sylius resource, Sylius 会 根据您的自动生成这些控制器服务 配置。

定义这些服务的实际代码行 is here.

#File: src/Sylius/Bundle/ResourceBundle/DependencyInjection/Driver/AbstractDriver.php
/* ... */
$container->setDefinition($metadata->getServiceId('controller'), $definition);
/* ... */

Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\AbstractDriver class 是(从 1.3 开始)一个基础 class Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\Doctrine\DoctrineORMDriver class。 Symfony 如何最终使用这个 class 尚不清楚,但是 幸运的是超出了这个答案的范围。