Nuevo en Symfony 3.4: configurando rutas y servicios con PHP
Symfony soporta varios formatos de configuración de forma nativa: XML, YAML, PHP y anotaciones. Lo mejor es que Symfony nunca te obliga a usar un formato determinado. La decisión siempre es tuya, e incluso puedes combinarlos (por ejemplo: YAML para la configuración básica, XML para servicios y anotaciones para las rutas).
Por defecto usamos el formato YAML en algunos de los archivos de configuración
principales (services.yml
, security.yml
, config.yml
) porque es un
formato conciso, fáicl de leer y suficientemente poderoso. Sin embargo, eso
requiere añadir el componente Yaml como dependencia de las aplicaciones
Symfony.
Uno de los objetivos de Symfony 4 es reducir lo máximo posible las dependencias de las aplicaciones (ya hemos reducido un 70% el código necesario para crear una aplicación). Así que eliminar esta dependencia del componente Yaml es uno de los objetivos a medio plazo. Podríamos hacerlo ya mismo y utilizar el formato PHP existente, pero no es lo bastante conciso y expresivo como queremos.
Así que en Symfony 3.4 hemos creado un nuevo formato de configuración basado en PHP para definir rutas y servicios. Así es como funciona para las rutas:
// app/config/routing.php return function (RoutingConfigurator $routes) { // importar rutas definidas en otros archivos $routes->import('legacy_routes.php') ->prefix('/legacy') ; // definir rutas usando una "interfaz fluída" de PHP $routes ->add('product', '/productos/{id}') ->controller('App\Controller\ProductController::show') ->schemes(['https']) ->requirements(['id' => '\d+']) ->defaults(['id' => 0]) ->add('homepage', '/') ->controller('App\Controller\DefaultController::index') ; };
Y así es como funciona para los servicios:
// app/config/services.php return function (ContainerConfigurator $container) { $container->import('legacy_services.php'); $params = $container->parameters(); $params->set('app.foo_param', 'param_value'); $container = $container->services()->defaults() ->private() ->autoconfigure() ->autowire(); $container ->load('App\\', '../src/*') ->exclude('../src/{Entity,Repository,Tests}'); $container ->load('App\\Controller\\', '../src/Controller') ->tag('controller.service_arguments'); $container->set(FooClass::class) ->args(['some_argument', ref(BarClass::class)]) ->tag('kernel.event_listener', ['event' => 'kernel.exception']); $container->alias('foo', FooClass::class)->public(); };
En las futuras versiones de Symfony podríamos utilizar este nuevo formato para los archivos de configuración principales, pero por el momento preferimos que la comunidad lo pruebe y nos de su opinión, así que seguiremos con YAML por un tiempo. Eso sí, tu podrás seguir usando el formato que quieras para cualquier archivo de tu aplicación Symfony. Eso no va a cambiar nunca.
Esta funcionalidad fue contribuida por Nicolas Grekas en los pull requests #23834 y #24180.
Fuente: New in Symfony: PHP-based configuration for services and routes
Comentarios
Proyectos Symfony destacados
La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.