0

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

4

1 に答える 1

0

あなたの正確なユースケースが何であるかはわかりませんが、次のヒントを提供したいと思います

  • これらの画像 (パス) はエンティティの属性として保存されますか? それでは、エンティティでアノテーションを直接使用してみませんか?

  • 本当にこれを構成可能にしたい場合は、そこから実際の構成を作成してみませんか?

  • サービスに何かを渡したい (そして構成を作成したくない) 場合は、yml ファイル内のパラメーターをサイズから作成してサービスに渡すか、 $container-を使用してサービス自体からパラメーターをフェッチするだけです。 >getParameter('NAME'); (コンテナが注入されていると仮定)

お役に立てれば幸いです、ニクソ

于 2013-11-08T10:13:11.223 に答える