symfony2のコントローラーでparameters.ymlからどのように読みますか?


146

app / config / parameters.ymlにいくつかのカスタム変数を配置しました。

parameters:
    api_pass: apipass
    api_user: apiuser

私は私のコントローラーからこれらにアクセスする必要があり、それらを取得しようとしました

$this->get('api_user');

私のコントローラーファイル内から。これを試すと、次のエラーメッセージが表示されます。

You have requested a non-existent service "api_user".

これを行う正しい方法は何ですか?

回答:


296

Symfony 2.6およびそれ以前のバージョン、あなたが最初のコンテナを取得する必要があり、そして- - 、コントローラ内のパラメータを取得するために必要なパラメータを。

$this->container->getParameter('api_user');

このドキュメントの章で説明しています。

ながら、$this->get()コントローラ内の方法は、サービス(ロードするドキュメントを

Symfony 2.7以降のバージョンは、次を使用することができ、コントローラ内のパラメータを取得します:

$this->getParameter('api_user');

3
getコントローラのメソッドもコンテナを使用しますが、パラメータではなくコンテナからのみサービスを取得できることに注意してください。getParameterパラメータを取得する必要があります。
Wouter J

試行する$this->getContainer()->getParameter('api_user');と致命的なエラーが発生します。未定義のメソッド..Longpath .. \ Controller :: getContainer()を呼び出します。
ボーア

1
@Bohr申し訳ありませんが、Symfony2のバージョンが異なります。私は自分の回答を編集しました-今すぐ確認してください;)
Vitalii Zurian


symfony 2.7以降:$this->hasParameter()まだ動作していません。
サマンモハマディ

23

The Clean Way-2018以降、Symfony 3.4以降

2017年とSymfony 3.3 + 3.4以降、セットアップと使用が簡単な、よりクリーンな方法があります。

コンテナーとサービス/パラメーターロケーターのアンチパターンを使用する代わりに、コンストラクターを介してクラスにパラメーターを渡すことができます。心配する必要はありません。時間のかかる作業ではなく、一度設定するだけでアプローチを忘れます

2ステップで設定する方法は?

1。 app/config/services.yml

# config.yml

# config.yml
parameters:
    api_pass: 'secret_password'
    api_user: 'my_name'

services:
    _defaults:
        autowire: true
        bind:
            $apiPass: '%api_pass%'
            $apiUser: '%api_user%'

    App\:
        resource: ..

2.任意 Controller

<?php declare(strict_types=1);

final class ApiController extends SymfonyController
{
    /**
     * @var string 
     */
    private $apiPass;

    /**
     * @var string
     */
    private $apiUser;

    public function __construct(string $apiPass, string $apiUser)
    {
        $this->apiPass = $apiPass;
        $this->apiUser = $apiUser;
    }

    public function registerAction(): void
    {
        var_dump($this->apiPass); // "secret_password"
        var_dump($this->apiUser); // "my_name"
    }
}

即時アップグレード準備完了!

古いアプローチを使用する場合は、Rectorを使用して自動化できます。

続きを読む

これは、サービスロケーターアプローチによるコンストラクターインジェクションと呼ばれます

これについてもっと読むには、私の投稿How to Get Parameter in Symfony Controller the Clean Wayをチェックしてください。

(テスト済みで、新しいSymfonyメジャーバージョン(5、6 ...)に合わせて更新されています)。


このトピックに関する新最小限方法:tomasvotruba.cz/blog/2018/11/05/...
トマーシュVotruba

10

私はあなたにswiftmailerの例を送ります:

parameters.yml

recipients: [email1, email2, email3]

サービス:

your_service_name:
        class: your_namespace
        arguments: ["%recipients%"]

サービスのクラス:

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}

8

Symfony 4では、以下を使用できますParameterBagInterface

use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;

class MessageGenerator
{
    private $params;

    public function __construct(ParameterBagInterface $params)
    {
        $this->params = $params;
    }

    public function someMethod()
    {
        $parameterValue = $this->params->get('parameter_name');
        // ...
    }
}

そしてでapp/config/services.yaml

parameters:
    locale: 'en'
    dir: '%kernel.project_dir%'

コントローラとフォームの両方のクラスで動作します。詳細については、Symfonyブログを参照してください


1
パラメータバッグ全体を渡すことは、コンテナ全体を渡すようなものです。(ポストから引用)「いくつかの特定のサービスは、コンテナのパラメータの多くを必要とする場合」にのみに理にかなって
トマーシュVotruba

それで、パラメータ全体を渡すとパフォーマンスに問題が発生するのですか?
ガザレjavaheri

これは理由の1つですが、主に読みやすさのためです。私はパラメータ名が表示された場合$meetupApiKey、私は少し良いよりも期待するものを知っている$parameterBag
トマーシュVotruba


0

symfony 4.3.1では私はこれを使います:

services.yaml

HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'

FrontController.php

$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');

4.8では機能しません。いつかうまくいったと思いますか?
Ricardo Martins

私はこれについて本当に忘れていましたが、はい、おそらく機能しました。テストしたものだけを投稿したからです!
Achraf JEDAY

1
すみません、Acharaf。わかりませんが、コントローラーでは機能しませんでした。コントローラ内では、DIなしでgetParameterを直接呼び出すことができます。すなわち:$this->getParameter('foo')。それがSF 4.8で機能させるために私がしたことです。
Ricardo Martins

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.