移動の溶液ながらcontact_email
には、parameters.yml
他の回答で提案されているように、簡単ですが、あなたは多くのバンドルを扱う場合には、簡単にパラメータファイルを乱雑にするか、コンフィギュレーションのネストされたブロックを扱う場合。
- まず、質問に厳密に答えます。
- 後で、共通のスペースをパラメーターとして渡さずに、サービスからこれらの構成を取得する方法を説明します。
最初のアプローチ:分離された構成ブロック、パラメーターとして取得
拡張子付き(ここでは拡張機能の詳細)を使用すると、これをのさまざまなブロックに簡単に "分離"しconfig.yml
て、コントローラーから取得可能なパラメーターとして挿入できます。
内部の拡張クラスの内部 DependencyInjection
ディレクトリように書き込みます。
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
// The next 2 lines are pretty common to all Extension templates.
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// This is the KEY TO YOUR ANSWER
$container->setParameter( 'my_nice_project.contact_email', $processedConfig[ 'contact_email' ] );
// Other stuff like loading services.yml
}
次に、config.yml、config_dev.ymlに次のように設定します
my_nice_project:
contact_email: someone@example.com
config.yml
あなたの中でそれを処理できるようにするには、MyNiceBundleExtension
あなたも必要になりますConfiguration
は、同じ名前空間のクラス。
class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root( 'my_nice_project' );
$rootNode->children()->scalarNode( 'contact_email' )->end();
return $treeBuilder;
}
}
次に、元の質問で望んだように、コントローラーから構成を取得できますが、parameters.yml
クリーンな状態を保ち、それをconfig.yml
別のセクションでます。
$recipient = $this->container->getParameter( 'my_nice_project.contact_email' );
2番目のアプローチ:分離された構成ブロック、構成をサービスに注入
同様の何かを探しているがサービスから設定を取得する読者にとっては、「パラメータ」の共通スペースを乱雑にせず、必要もない、より良い方法があります。 container
、サービスに渡すます(コンテナ全体を渡すことは、避ける)。
上記のこのトリックは、まだあなたの設定のパラメータ空間に「注入」します。
それにもかかわらず、サービスの定義をロードした後、たとえばsetConfig()
サービスにのみブロックを注入するようなメソッド呼び出しを追加できます。
たとえば、Extensionクラスでは次のようになります。
class MyNiceProjectExtension extends Extension
{
public function load( array $configs, ContainerBuilder $container )
{
$configuration = new Configuration();
$processedConfig = $this->processConfiguration( $configuration, $configs );
// Do not add a paramater now, just continue reading the services.
$loader = new YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) );
$loader->load( 'services.yml' );
// Once the services definition are read, get your service and add a method call to setConfig()
$sillyServiceDefintion = $container->getDefinition( 'my.niceproject.sillymanager' );
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'contact_email' ] ) );
}
}
次に、services.yml
絶対的な変更なしに、通常どおりサービスを定義します。
services:
my.niceproject.sillymanager:
class: My\NiceProjectBundle\Model\SillyManager
arguments: []
次に、SillyManager
クラスにメソッドを追加します。
class SillyManager
{
private $contact_email;
public function setConfig( $newConfigContactEmail )
{
$this->contact_email = $newConfigContactEmail;
}
}
これはスカラー値の代わりに配列でも機能することに注意してください!ウサギのキューを構成し、ホスト、ユーザー、パスワードが必要だと想像してください。
my_nice_project:
amqp:
host: 192.168.33.55
user: guest
password: guest
もちろん、ツリーを変更する必要がありますが、次のようにすることができます。
$sillyServiceDefintion->addMethodCall( 'setConfig', array( $processedConfig[ 'amqp' ] ) );
そしてサービスで次のようにします:
class SillyManager
{
private $host;
private $user;
private $password;
public function setConfig( $config )
{
$this->host = $config[ 'host' ];
$this->user = $config[ 'user' ];
$this->password = $config[ 'password' ];
}
}
お役に立てれば!