使用自定义标记定义Symfony2服务

时间:2013-08-23 06:43:21

标签: service configuration symfony-2.2

我的Symfony2应用程序中有一个图像服务,用于调整图像大小。我希望能够以这样的方式配置此服务,即它可以采用许多指示有效图像大小的参数。例如。这是我目前的服务定义:

my.service.image:
    class: My\Service\ImageService
    arguments: ["@service_container"]

不知何故,我想表明有效数量的图像尺寸。我已经研究过使用标签,但我不确定它们是否适合在这种情况下使用。在一个理想的世界里,我可能希望得到一些看起来像这样的东西:

my.service.image:
    class: My\Service\ImageService
    arguments: ["@service_container"]
    sizes:
        - { name: small, width: 100, height: 100 }
        - { name: medium, width: 100, height: 100 }
        - { name: large, width: 100, height: 100 }

实施此操作的最佳方式是什么以及如何让我的服务了解各种“尺寸”?

更新

我取得了一些进展,但我仍然坚持这个问题。这是我迄今为止所取得的成就。

我使用标签来实现不同的尺寸:

my.service.image:
    class: My\Service\ImageService
    arguments: ["@service_container"]
    tags:
        - { name: my.service.image.size, alias: small,  width: 100, height: 100 }
        - { name: my.service.image.size, alias: medium, width: 200, height: 200 }
        - { name: my.service.image.size, alias: large,  width: 300, height: 300 }

尝试按照食谱文档[1],我最终在我的包中创建了一个* CompilerPass类:

namespace My\Bundle\MyImageBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Reference;

class ImageServiceSizeCompilerPass implements CompilerPassInterface {

    public function process( ContainerBuilder $container )
    {
        $definition = $container->get(
            'my.service.image'
        );

        $taggedServices = $container->findTaggedServiceIds(
            'my.service.image.size'
        );

        foreach( $taggedServices as $defintion => $attributes )
        {
            foreach( $attributes as $attribute )
            {
                $definition->addSize( $attribute['alias'], $attribute['width'], $attribute['height'] );
            }
        }
    }

}

以上实际上是在服务上调用addSize方法。我不确定上述内容是否正确,但似乎工作正常。

我现在遇到的问题是,在我的应用程序代码中,我从容器请求my.service.image时,它似乎再次实例化它,而不是第一次返回它已经创建的实例。

非常感谢任何见解。

[1] http://symfony.com/doc/current/components/dependency_injection/tags.html

1 个答案:

答案 0 :(得分:0)

我不确定你的用例是什么,但我想给你以下提示

  • 这些图片(他们的路径)是否保存为实体的属性?那为什么不用 实体的注释直接?

  • 如果你真的想让这个可配置,那么为什么不用它来创建一个真正的配置呢?

  • 如果您想将某些内容传递给您的服务(并且不想创建配置),那么您就是这样 可以使你的yml文件中的参数超出你的大小,并将它们传递给你的 服务或您只需使用您的服务本身获取参数 $ container-> getParameter('NAME'); (假设您已注入容器)

希望我能提供帮助, nixo