我的 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