【问题标题】:symfony2 factory-service in yamlyaml 中的 symfony2 工厂服务
【发布时间】:2014-04-05 17:12:17
【问题描述】:

查看 Symfony 的 Sylius Bundle 的代码,我注意到 Resource Bundle 有一种将资源控制器定义为服务的有趣方式。 这是 XML 中的购物车项目控制器服务配置

<service id="sylius.controller.cart_item" class="%sylius.controller.cart_item.class%">
        <argument type="service">
            <service factory-service="sylius.controller.configuration_factory" factory-method="createConfiguration" class="Sylius\Bundle\ResourceBundle\Controller\Configuration">
                <argument>sylius</argument>
                <argument>cart_item</argument>
                <argument>SyliusCartBundle:CartItem</argument>
            </service>
        </argument>
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>

如果我理解正确,此代码将实例化控制器类并将调用工厂服务类中的工厂方法“createConfiguration”的结果作为构造函数参数传递。参数是指定的,所以一切都很好。

我的问题有两个: 1)这在哪里记录?我在文档中找不到这种参数的一个例子——作为工厂可调用的。 2) 这个的 YAML 版本是什么?

谢谢...

【问题讨论】:

    标签: symfony sylius


    【解决方案1】:

    方法如下:

    <service id="sylius.controller.cart_item" class="%sylius.controller.cart_item.class%">
        <argument type="service">
            <service factory-service="sylius.controller.configuration_factory" factory-method="createConfiguration" class="Sylius\Bundle\ResourceBundle\Controller\Configuration">
                <argument>sylius</argument>
                <argument>cart_item</argument>
                <argument>SyliusCartBundle:CartItem</argument>
            </service>
        </argument>
        <call method="setContainer">
            <argument type="service" id="service_container" />
        </call>
    </service>
    

    在yml中可以写成如下

    sylius.controller.cart_item:
        class: %sylius.controller.cart_item.class%
        arguments:
            - "@=service('sylius.controller.configuration_factory').createConfiguration('sylius', 'cart_item', 'SyliusCartBundle:CartItem')"
        calls:
            - [setContainer, ["@service_container"]]
    

    【讨论】:

      【解决方案2】:

      您可以在dependency injection docs 中找到这两个问题的答案。

      就在 YAML 中定义嵌套在另一个服务下的服务而言,Symfony 附带的解析器似乎无法处理,但我确实找到了似乎针对此功能的某人的宠物项目:https://gist.github.com/Mikulas/8004470

      【讨论】:

      • 老实说,依赖注入文档是我看的第一个地方。在您链接的页面中,有一个使用工厂创建服务的示例。我正在寻找一个使用工厂创建服务的示例,该服务作为参数传递给不同的服务,只是略有不同。这就是上面的 xml 所做的。在我看来,它相似但不一样。
      • 唯一的区别是语法。我真的不喜欢 Sylius 包在这里的做法,因为工厂服务不可重用。即使您 100% 确定您的工厂服务只会在一个地方使用,但从可读性的角度来看,独立声明它仍然更有意义。
      • 我同意你的观点。我问的事实并不意味着我喜欢它或建议使用它。 :) 我仍然想知道这种语法是否记录在任何地方以及相应的 yml 是什么......:D
      • 好吧,那只是求知欲。我可以理解 :) 默认 YAML 解析器似乎无法理解嵌套服务定义,但我确实找到了这个 https://gist.github.com/Mikulas/8004470
      【解决方案3】:

      我试图覆盖 CartItemController 并遇到了这个问题,因为我认为我需要这样做。但它不是要走的路。无论如何,回答你的问题。下面是 xml 如何转换为 yaml

      (因为 Alexei Tenitski 建议的解决方案对我不起作用,所以我这样做了)

      sylius.controller.cart_item:
          class:    Sylius\Bundle\ResourceBundle\Controller\ResourceController
          arguments:   ["@sylius.cart_item.config_factory"]
          calls:
             - [setContainer, ["@service_container"]]
      
      sylius.cart_item.config_factory:
          class:  Sylius\Bundle\ResourceBundle\Controller\Configuration
          factory_class: Sylius\Bundle\ResourceBundle\Controller\ConfigurationFactory
          factory_method: createConfiguration
          arguments: ["sylius", "cart_item", "SyliusCartBundle:CartItem"]
      

      但我猜你是想覆盖 CartItem 控制器,对吧? :) 无论如何,这就是我想要做的。

      Sylius Docs 中解释了您将如何去做。像这样:

      location : yourbundle/resources/config/config.yml
      
      sylius_cart:
          classes:
              item:
                  controller: YourBundle\Controller\CartItemController
      

      此外,请确保如果您配置到新控制器操作的路由,则使用控制器服务而不是常规方法。

      location : yourbundle/resources/config/routing.yml
      
      mybundle_ajaxcart_add:
          path:     /ajax/cart/add
          defaults: { _controller: sylius.controller.cart_item:addAjaxAction }
      

      我想在这里发布它,因为我找了大约半天,可能有人会寻找相同的解决方案。而且我喜欢让那个人免于头痛;)

      【讨论】:

      • 感谢您提供此信息...它对与 Sylius 合作非常有用,我相信它会省去很多麻烦 :D。至于我,我对在 yml 的服务定义中使用工厂很感兴趣。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多