153

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

parameters:
    api_pass: apipass
    api_user: apiuser

コントローラからこれらにアクセスする必要があり、でそれらをフェッチしようとしました

$this->get('api_user');

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

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

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

4

8 に答える 8

302

Symfony 2.6以前のバージョンでは、コントローラーでパラメーターを取得するには、最初にコンテナーを取得し、次に必要なパラメーターを取得する必要があります。

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

このドキュメントの章では、それについて説明しています。

コントローラのメソッドはサービスを$this->get()ロードしますが(doc

Symfony 2.7以降のバージョンでは、コントローラーでパラメーターを取得するには、以下を使用できます。

$this->getParameter('api_user');
于 2012-12-16T12:26:29.823 に答える
28

クリーンウェイ-2018+、Symfony 3.4+

2017年とSymfony3.3+ 3.4以降、はるかにクリーンな方法があります-セットアップと使用が簡単です。

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

2つのステップで設定するにはどうすればよいですか?

1.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を使用して自動化できます。

続きを読む

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

これについてもっと読むには、私の投稿「Symfonyコントローラーでパラメーターを取得する方法」をチェックしてください。

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

于 2018-01-21T20:51:34.067 に答える
11

swiftmailerの例をお送りします。

parameters.yml

recipients: [email1, email2, email3]

サービス:

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

サービスのクラス:

protected $recipients;

public function __construct($recipients)
{
    $this->recipients = $recipients;
}
于 2016-03-31T08:28:45.923 に答える
10

ParameterBagInterfaceSymfony 4では、 :を使用できます。

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ブログをご覧ください

于 2018-09-05T12:44:02.047 に答える
2

次を使用できます。

public function indexAction()
{
   dump( $this->getParameter('api_user'));
}

詳細については、ドキュメントを読むことをお勧めします。

http://symfony.com/doc/2.8/service_container/parameters.html

于 2017-03-09T10:13:33.997 に答える
1

Symfony 5では、コントローラーが拡張されたときに次のAbstractControllerものを使用できます。

$projectDir = $this->getParameter('kernel.project_dir');

詳細については、 https://symfony.com/doc/current/configuration.html#accessing-configuration-parametersを参照してください。

于 2021-04-15T14:15:59.953 に答える
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');
于 2019-07-03T09:34:09.680 に答える
-1

次のものも使用できます。

$container->getParameter('api_user');

http://symfony.com/doc/current/service_container/parameters.htmlにアクセスします

于 2016-12-08T12:45:45.597 に答える