2013-08-23 83 views
0

我在我的Symfony2應用程序中調整了圖像大小的圖像服務。我希望能夠以這種方式配置此服務,以便可以採用許多指示有效圖像大小的參數。例如。這是我目前的服務定義:使用自定義標籤定義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 } 

什麼是實現這一點,如何讓我的服務感知的各種「規格」的最佳方式?

UPDATE:

我已經取得了一些進展,但我仍然停留在這個問題上。這是迄今爲止我所取得的成就。

我用標籤來實現不同尺寸:

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

回答

0

我不知道你的exaclty是你的使用情況,但我想給你以下提示

  • 難道這些圖像(它們的路徑)保存爲實體的屬性?那爲什麼不直接在實體上使用 註解?

  • 如果你真的想要這個可配置的,那麼爲什麼不創建一個真正的配置呢?

  • 如果你想的東西傳遞到您的服務(而不是要創建一個配置),你 可以使您的YML文件中paramters你的尺寸,並將其傳遞到您的 服務,或者你只是獲取從參數您的服務本身使用 $ container-> getParameter('NAME');(假設你有一個注入容器)

希望我能幫上忙, nixo