查看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版本是什么?
谢谢...
答案 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 }
我想在这里发布,因为我正在寻找这个约半天,可能有人会寻找相同的解决方案。而且我喜欢让那个人头疼;)