将参数从config.yml传递给资产筛选器服务



为了将CommonJS模块编译成单个文件,我已经编写了自己的资产过滤器,包含在Symfony2 Bundle中。它被称为cjsDeliveryBundle,但我们现在先把它放在一边。

我希望能够从我的config_dev.ymlconfig_prod.yml文件中设置不同的过滤器选项。

过滤器有一个公共设置器:setMinifyIdentifiers,它接受一个布尔值。我阅读了Symfony2关于setter注入的文档,并在我的config.yml中添加了以下内容:

assetic:
    filters:
        cssrewrite: ~
        cjs_delivery:
            resource: "%kernel.root_dir%/../src/MattCG/cjsDeliveryBundle/Resources/config/services.xml"
            calls:
                - [ setMinifyIdentifiers, [ true ] ]

以下是我的Bundle的services.xml

<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <parameters>
        <parameter key="matt_cg.cjs_delivery_filter.class">MattCGcjsDeliveryBundleAsseticFiltercjsDeliveryFilter</parameter>
        <parameter key="matt_cg.cjs_delivery_filter.minify_identifiers">null</parameter>
    </parameters>
    <services>
        <service id="matt_cg.cjs_delivery_filter" class="%matt_cg.cjs_delivery_filter.class%">
            <tag name="assetic.filter" alias="cjs_delivery"></tag>
            <call method="setMinifyIdentifiers">
                <argument>%matt_cg.cjs_delivery_filter.minify_identifiers%</argument>
            </call>
        </service>
    </services>
</container>

过滤器工作得很好,除了setter永远不会以true作为参数调用。我做错了什么?

明白了。解决方案是为每个环境使用单独的YAML参数文件,并在每个环境中指定过滤器参数。

在我的例子中我是这样做的

  1. config.yml中的imports:指令中删除- { resource: parameters.yml }
  2. 删除parameters.yml文件,并将参数放在两个新文件中:parameters_dev.ymlparameters_prod.yml
  3. - { resource: parameters_dev.yml }添加到config_dev.yml中的imports:指令中,将- { resource: parameters_prod.yml }添加到config_prod.yml中的imports:指令中。
  4. matt_cg.cjs_delivery_filter.minify_identifiers: true添加到parameters_prod.yml中的parameters:指令中。

最新更新