Как читать с параметров .yml в контроллере в symfony2?
В моем приложении /config/parameters.yml добавлена пара пользовательских переменных.
parameters:
api_pass: apipass
api_user: apiuser
Мне нужно получить доступ к ним из моего контроллера и попытались получить их с помощью
$this->get('api_user');
из моего файла контроллера. Когда я попробую это, я получаю это сообщение об ошибке:
You have requested a non-existent service "api_user".
Каков правильный способ сделать это?
Ответы
Ответ 1
В Symfony 2.6 и более ранних версиях, чтобы получить параметр в контроллере - сначала вы должны получить контейнер, а затем - необходимый параметр.
$this->container->getParameter('api_user');
Эта глава объясняет это.
В то время как метод $this->get()
в контроллере будет загружать службу (doc)
В Symfony 2.7 и более новых версиях, чтобы получить параметр в контроллере, вы можете использовать следующее:
$this->getParameter('api_user');
Ответ 2
Чистый Путь
Начиная с 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...)).
Ответ 3
Присылаю вам пример с swiftmailer:
parameters.yml
recipients: [email1, email2, email3]
услуги:
your_service_name:
class: your_namespace
arguments: ["%recipients%"]
класс службы:
protected $recipients;
public function __construct($recipients)
{
$this->recipients = $recipients;
}
Ответ 4
В 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.
Ответ 5
Вы можете использовать:
public function indexAction()
{
dump( $this->getParameter('api_user'));
}
Для получения дополнительной информации я рекомендую вам прочитать документ:
http://symfony.com/doc/2.8/service_container/parameters.html
Ответ 6
В 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');
Ответ 7
Вы также можете использовать:
$container->getParameter('api_user');
Посетите http://symfony.com/doc/current/service_container/parameters.html