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

Publicada el

27 de septiembre de 2017

Etiquetas

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.