2017-01-19 6 views
0

私はSymfonyを使用しており、AppBundleのparameters.xmlに設定したすべてのアプリケーションパラメータを保持するサービスを作成しようとしています。symfonyすべてのバンドルパラメータをDIサービスにインジェクト

サービスにServiceContainerを注入し、その上で - > get( 'param_name')を使ってうまくいきましたが、コンテナ全体を注入することは非常に悪いことです。

サービス定義に引数として追加することなく、すべてのパラメータを自分のサービスに注入することができますか?コンテナの注入は、ほとんどの場合、アンチパターンです:

最終プロジェクト私は、サービス定義

<service id="myapp.application_parameters" class="AppBundle\DependencyInjection\Service\ApplicationParametersService"> 
    <argument type="service" id="service_container" /> 
</service> 

とサービスクラス

namespace AppBundle\DependencyInjection\Service; 

use Symfony\Component\DependencyInjection\ContainerInterface; 

class ApplicationParametersService 
{ 
    private $_container; 
    protected $developmentEmail; 

    function __construct(ContainerInterface $container) 
    { 
     $this->_container = $container; 

     $this->developmentEmail = $this->_container->getParameter('myapp.dev.email'); 

    } 

public function getDevEmail() 
{ 
    return $this->developmentEmail; 
} 

答えて

0

あなたは正しいです

本質的にこれをしませんでした。しかし、すべてのパラメータを注入することも悪い習慣です。サービスに実際にどのパラメータが使用されているのかは分かりません。なぜなら、すべてのパラメータにアクセスできるからです。 コードが実際に必要とする値だけを取得する方が良いでしょう。

このようにして、定型コードを減らす必要がある場合は、親サービスまたは自動配線を使用できます。

<service id="generic_service" abstract="true"> 
    <!-- it's better than whole container --> 
    <argument type="service" id="myapp.application_parameters"/> 
</service> 

<service id="specific_service_a" class="..." parent="generic_service"/> 
<service id="specific_service_b" class="..." parent="generic_service"/> 

2)オートワイヤリング付き:

<service id="specific_service_a" class="..." autowire="true"> 

少なくとも、あなたはglobal variableを介して容器を得ることができますparent service

1)。最も危険な方法ですが、機能します。

関連する問題