4

查看 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 版本?

谢谢...

4

3 回答 3

4

这是方法:

<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"]]
于 2015-02-19T20:34:34.877 回答
2

您可以在依赖注入文档中找到这两个问题的答案。

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

于 2014-04-05T21:55:08.337 回答
2

我试图覆盖 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 控制器,对吧?:) 无论如何,这就是我想要做的。

In the Sylius Docs is explained how you would go about doing that. Like this :

location : yourbundle/resources/config/config.yml

sylius_cart:
    classes:
        item:
            controller: YourBundle\Controller\CartItemController

Also, make sure that if you configure the route to your new controller action, you use the controller service instead of the normal approach.

location : yourbundle/resources/config/routing.yml

mybundle_ajaxcart_add:
    path:     /ajax/cart/add
    defaults: { _controller: sylius.controller.cart_item:addAjaxAction }

I wanted to post it here, because I was looking for this for about half a day and probably someone is going to be looking for the same solution. And I like to save that person the headache ;)

于 2015-03-26T09:04:34.090 回答