yaml的symfony2工厂服务

时间:2014-04-05 17:12:17

标签: symfony sylius

查看Sylius Bundle for Symfony的代码我注意到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>

如果我理解正确的话,这段代码会实例化控制器类,并作为构造函数参数传递对工厂方法的调用结果&#34; createConfiguration&#34;在工厂服务类。指定了参数,所以一切都很好。

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

谢谢...

3 个答案:

答案 0 :(得分: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"]]

答案 1 :(得分:2)

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

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

答案 2 :(得分: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控制器,对吗? :)这就是我试图做的事情。

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 }

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