Чистый путь - 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 .
Читать далее
Это называется инжекцией конструктора через поиск сервисов .
Чтобы узнать больше об этом, прочитайте мой пост Как получить параметр в Symfony Controller Чистым способом .
(Он протестирован, и я обновляю его для новой основной версии Symfony (5, 6 ...)).
get
метод в контроллере также использует контейнер, но он может получать сервисы только из контейнера, а не из параметров. Вам нужноgetParameter
получить параметры.