J'ai mis quelques variables personnalisées dans mon application/config/parameters.yml.
parameters:
api_pass: apipass
api_user: apiuser
J'ai besoin d'y accéder depuis mon contrôleur et j'ai essayé de les récupérer avec
$this->get('api_user');
à partir de mon fichier de contrôleur. Quand j'essaye ceci, j'obtiens ce message d'erreur:
You have requested a non-existent service "api_user".
Quelle est la bonne façon de faire cela?
Dans Symfony 2.6 et versions antérieures, pour obtenir un paramètre dans un contrôleur, vous devez d'abord obtenir le conteneur, puis le paramètre requis.
$this->container->getParameter('api_user');
Ce chapitre de documentation l'explique.
Alors que la méthode $this->get()
dans un contrôleur chargera un service ( doc )
Dans Symfony 2.7 et les versions plus récentes, vous pouvez utiliser les éléments suivants pour obtenir un paramètre dans un contrôleur:
$this->getParameter('api_user');
Depuis 2017 et Symfony 3.3 + 3.4, il existe un moyen beaucoup plus propre - facile à installer et à utiliser.
Au lieu d'utiliser l'anti-modèle de conteneur et de localisateur de service/paramètre, vous pouvez transmettre des paramètres à class via son constructeur. Ne vous inquiétez pas, ce n’est pas un travail fastidieux, mais bien une configuration unique et l’oubli approche.
Comment le configurer en 2 étapes?
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"
}
}
Si vous utilisez une approche plus ancienne, vous pouvez l’automatiser avec Rector .
C'est ce qu'on appelle l'approche constructeur injection over services locator.
Pour en savoir plus à ce sujet, consultez mon article Comment obtenir un paramètre propre à Symfony Controller .
(Il a été testé et je le garde à jour pour la nouvelle version majeure de Symfony (5, 6 ...)).
Je vous envoie un exemple avec swiftmailer:
recipients: [email1, email2, email3]
your_service_name:
class: your_namespace
arguments: ["%recipients%"]
protected $recipients;
public function __construct($recipients)
{
$this->recipients = $recipients;
}
Dans Symfony 4, vous pouvez utiliser la variable 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');
// ...
}
}
et en app/config/services.yaml
:
parameters:
locale: 'en'
dir: '%kernel.project_dir%'
Cela fonctionne pour moi dans les classes de contrôleur et de formulaire. Plus de détails peuvent être trouvés dans le blog de Symfony .
Dans Symfony 4.3.1, j'utilise ceci:
services.yaml
HTTP_USERNAME: 'admin'
HTTP_PASSWORD: 'password123'
FrontController.php
$username = $this->container->getParameter('HTTP_USERNAME');
$password = $this->container->getParameter('HTTP_PASSWORD');
Vous pouvez utiliser:
public function indexAction()
{
dump( $this->getParameter('api_user'));
}
Pour plus d'informations, je vous recommande de lire la doc:
http://symfony.com/doc/2.8/service_container/parameters.html