O Caminho Limpo - 2018+, Symfony 3.4+
Desde 2017 e Symfony 3.3 + 3.4, há uma maneira muito mais limpa - fácil de configurar e usar.
Em vez de usar o contêiner e o antipadrão de localizador de serviço / parâmetro, você pode passar parâmetros para a classe via seu construtor . Não se preocupe, não é um trabalho demorado, mas configure uma vez e esqueça a abordagem.
Como configurá-lo em 2 etapas?
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. Qualquer 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"
}
}
Pronto para atualização instantânea!
Caso você use uma abordagem mais antiga, você pode automatizá-la com o Rector .
consulte Mais informação
Isso é chamado de abordagem de injeção de construtor sobre localizador de serviços .
Para ler mais sobre isso, confira meu post Como obter parâmetros no Symfony Controller de maneira limpa .
(Ele foi testado e eu o mantenho atualizado para a nova versão principal do Symfony (5, 6 ...)).
get
método no controlador também usa o contêiner, mas ele só pode obter serviços de um contêiner, não de parâmetros. Você precisagetParameter
obter parâmetros.