【问题标题】:Resolving Controller Services in Sylius/Symfony在 Sylius/Symfony 中解析控制器服务
【发布时间】:2019-01-22 20:39:17
【问题描述】:

Hoes Symfony 是否将 Sylius 服务 sylius.controller.shop_user 服务解析为控制器类文件 Sylius\Bundle\UserBundle\Controller\UserController

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

但是,我似乎在任何地方的 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 如何知道为该服务实例化正确的类?

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

我没有任何具体的任务,我只是想了解一下 Sylius 和 Symfony 是如何工作的。

【问题讨论】:

  • 可能是在SyliusBundle依赖注入扩展类中动态配置的。只是一个猜测,但扩展类是大多数 di 魔法往往发生的地方。
  • @Cerad 作为 Symfony 正常动态控制器处理程序的一部分?或者 Sylius 正在做什么特别的事情?还是别的什么?
  • 我没有深入了解 Sylius,但扩展是通常定义服务的地方。如果它没有在扩展本身中定义,几乎可以肯定是在编译器通过。控制器没什么特别的。 Symfony 路由将拉取您为 _controller 指定的任何服务并对其调用操作。尝试在整个代码库中搜索 shop_user。这应该让你明白定义。
  • 所以出于好奇,我加载了 Sylius 并四处探查了一下。这确实是一个巨大的工程。很多很多的抽象层次。 @pamil 下面的回答是一个很好的起点。

标签: php symfony sylius


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    名称为 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 开始)的基类 Sylius\Bundle\ResourceBundle\DependencyInjection\Driver\Doctrine\DoctrineORMDriver 班级。 Symfony 最终如何使用这个类尚不清楚,但 幸运的是超出了这个答案的范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 2017-01-28
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多