Config.ymlファイルに次のような設定を追加しました:
app.config:
contact_email: [email protected]
...
私の人生では、それを変数に読み込む方法がわかりません。私は自分のコントローラーでこのようなことを試しました:
$recipient =
$this->container->getParameter('contact_email');
しかし、次のようなエラーが表示されます。
パラメーター「contact_email」を定義する必要があります。
キャッシュをクリアしました。Symfony2でリロードされたサイトのドキュメントも見ましたが、その方法はわかりません。
おそらく、今これを理解するにはあまりにも疲れています。誰でもこれを助けることができますか?
contact_email
内でapp.config
を定義するのではなく、parameters
エントリで定義します。
parameters:
contact_email: [email protected]
コントローラー内で行っている呼び出しが動作するようになります。
contact_email
をparameters.yml
に移動するソリューションは簡単ですが、他の回答で提案されているように、多くのバンドルを処理する場合や構成のネストされたブロックを処理する場合、パラメーターファイルが簡単に乱雑になる可能性があります。
最初のアプローチ:構成ブロックを分離し、パラメーターとして取得する
拡張機能( 拡張機能の詳細 )を使用すると、これをconfig.yml
の異なるブロックに簡単に「分離」して、それをコントローラーから取得可能なパラメーターとして注入できます。
DependencyInjection
ディレクトリ内のExtensionクラス内に次のように記述します。
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: [email protected]
MyNiceBundleExtension
内でそのconfig.yml
を処理できるようにするには、同じ名前空間の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のアプローチ:構成ブロックを分離し、構成をサービスに挿入します
似たようなものを探しているが、サービスから設定を取得する読者には、「paramaters」共通スペースを散らかさず、サービスに渡す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' ];
}
}
お役に立てれば!
ダグラスの答えに追加する必要があります。グローバル設定にアクセスできますが、symfonyはいくつかのパラメーターを変換します。例えば:
# config.yml
...
framework:
session:
domain: 'localhost'
...
は
$this->container->parameters['session.storage.options']['domain'];
Var_dumpを使用して、指定したキーまたは値を検索できます。
バンドルの設定パラメータを公開できるようにするには、ドキュメントを参照してください。それはかなり簡単です:)
リンクは次のとおりです。 バンドルのセマンティック構成を公開する方法
前述のように、インジェクションコンテナを使用して任意のパラメータにアクセスし、そのパラメータプロパティを使用できます。
"Symfony-コンテナサービス定義の操作" は、それに関する良い記事です。
http://tutorial.symblog.co.uk/ のコード例から簡単な方法を学びました
1)ZendeskBlueFormBundleとファイルの場所に注意してください
# myproject/app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: @ZendeskBlueFormBundle/Resources/config/config.yml }
framework:
2)Zendesk_BlueForm.emails.contact_emailとファイルの場所に注意してください
# myproject/src/Zendesk/BlueFormBundle/Resources/config/config.yml
parameters:
# Zendesk contact email address
Zendesk_BlueForm.emails.contact_email: [email protected]
3)$ clientで取得する方法とコントローラーのファイルの場所に注意してください
# myproject/src/Zendesk/BlueFormBundle/Controller/PageController.php
public function blueFormAction($name, $arg1, $arg2, $arg3, Request $request)
{
$client = new ZendeskAPI($this->container->getParameter("Zendesk_BlueForm.emails.contact_email"));
...
}