App/config/parameters.ymlにいくつかのカスタム変数を追加しました。
parameters:
api_pass: apipass
api_user: apiuser
私はコントローラーからこれらにアクセスする必要があり、それらを取得しようとしました
$this->get('api_user');
コントローラーファイル内から。これを試すと、次のエラーメッセージが表示されます。
You have requested a non-existent service "api_user".
これを行う正しい方法は何ですか?
2017年およびSymfony 3.3 + 3.4以降よりクリーンな方法があります-セットアップと使用が簡単です。
コンテナおよびサービス/パラメーターロケーターのアンチパターンを使用する代わりに、コンストラクター経由でパラメーターをクラスに渡すを使用できます。心配する必要はありません。時間のかかる作業ではなく、一度だけセットアップして忘れるアプローチです。
2ステップで設定する方法は?
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: ..
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 ...)に合わせて更新されています)。
Swiftmailerを使用して例を送信します。
recipients: [email1, email2, email3]
your_service_name:
class: your_namespace
arguments: ["%recipients%"]
protected $recipients;
public function __construct($recipients)
{
$this->recipients = $recipients;
}
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ブログにあります 。
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');
次を使用できます。
public function indexAction()
{
dump( $this->getParameter('api_user'));
}
詳細については、ドキュメントを読むことをお勧めします:
http://symfony.com/doc/2.8/service_container/parameters.html