web-dev-qa-db-ja.com

Symfony2 config.ymlから構成設定を読み取るにはどうすればよいですか?

Config.ymlファイルに次のような設定を追加しました:

app.config:
    contact_email: [email protected]
    ...

私の人生では、それを変数に読み込む方法がわかりません。私は自分のコントローラーでこのようなことを試しました:

$recipient =
$this->container->getParameter('contact_email');

しかし、次のようなエラーが表示されます。

パラメーター「contact_email」を定義する必要があります。

キャッシュをクリアしました。Symfony2でリロードされたサイトのドキュメントも見ましたが、その方法はわかりません。

おそらく、今これを理解するにはあまりにも疲れています。誰でもこれを助けることができますか?

187

contact_email内でapp.configを定義するのではなく、parametersエントリで定義します。

parameters:
    contact_email: [email protected]

コントローラー内で行っている呼び出しが動作するようになります。

192

contact_emailparameters.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' ];
    }
}

お役に立てれば!

168
Xavi Montero

ダグラスの答えに追加する必要があります。グローバル設定にアクセスできますが、symfonyはいくつかのパラメーターを変換します。例えば:

# config.yml
... 
framework:
    session:
        domain: 'localhost'
...

$this->container->parameters['session.storage.options']['domain'];

Var_dumpを使用して、指定したキーまたは値を検索できます。

34
Felipe Buccioni

バンドルの設定パラメータを公開できるようにするには、ドキュメントを参照してください。それはかなり簡単です:)

リンクは次のとおりです。 バンドルのセマンティック構成を公開する方法

17

前述のように、インジェクションコンテナを使用して任意のパラメータにアクセスし、そのパラメータプロパティを使用できます。

"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"));
    ...
    }
3
Dung