私の 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