¿Cómo leo los parameters.yml en un controlador en symfony2?
symfony-2.3 (5)
He puesto un par de variables personalizadas en mi aplicación / config / parameters.yml.
parameters:
api_pass: apipass
api_user: apiuser
Necesito acceder a estos desde mi controlador y he intentado buscarlos
$this->get(''api_user'');
desde mi archivo de controlador. Cuando pruebo esto, aparece este mensaje de error:
You have requested a non-existent service "api_user".
¿Cuál es la forma correcta de hacer esto?
El camino limpio
Desde 2017 y Symfony 3.3 + 3.4 hay una manera mucho más limpia, fácil de configurar y usar.
En lugar de utilizar contenedor y servicio / parámetro localizador anti-patrón, puede pasar parámetros a la clase a través de su constructor . No se preocupe, no es un trabajo que demanda mucho tiempo, sino que se configura una vez y se olvida el enfoque.
¿Cómo configurarlo en 2 pasos?
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. Cualquier 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"
}
}
Actualización instantánea listo!
En caso de que use un enfoque anterior, puede automatizarlo con Rector .
Lee mas
Esto se llama inyección de constructor sobre el enfoque del localizador de servicios .
Para leer más sobre esto, revisa mi publicación Cómo obtener parámetros en Symfony Controller Clean Way .
(Se ha probado y lo mantengo actualizado para la nueva versión principal de Symfony (5, 6 ...)).
En Symfony 2.6 y versiones anteriores , para obtener un parámetro en un controlador, primero debe obtener el contenedor y, luego, el parámetro necesario.
$this->container->getParameter(''api_user'');
Este capítulo de documentación lo explica.
Mientras que el método $this->get()
en un controlador cargará un servicio ( doc )
En Symfony 2.7 y las versiones más nuevas , para obtener un parámetro en un controlador puede usar lo siguiente:
$this->getParameter(''api_user'');
Puedes usar:
public function indexAction()
{
dump( $this->getParameter(''api_user''));
}
Para obtener más información, le recomiendo que lea el documento:
http://symfony.com/doc/2.8/service_container/parameters.html
También puedes usar:
$container->getParameter(''api_user'');
Visita http://symfony.com/doc/current/service_container/parameters.html
Te envío un ejemplo con swiftmailer:
parameters.yml
recipients: [email1, email2, email3]
servicios:
your_service_name:
class: your_namespace
arguments: ["%recipients%"]
la clase del servicio:
protected $recipients;
public function __construct($recipients)
{
$this->recipients = $recipients;
}