Чистий шлях - 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"
}
}
Моментальна оновлення готова!
Якщо ви використовуєте більш старий підхід, ви можете автоматизувати його за допомогою ректора .
Детальніше
Це називається введенням конструктора над підходом служб локатора .
Щоб прочитати більше про це, перевірте мій пост Як отримати параметр в контролері Symfony чистим шляхом .
(Це тестовано, і я постійно оновлюю його для нової основної версії Symfony (5, 6 ...)).
get
метод у контролері також використовує контейнер, але він може отримувати лише послуги з контейнера, а не параметри. ПотрібноgetParameter
отримати параметри.