¿Cómo reutilizar el código con los paquetes de Symfony 5? Parte 5. Configuración

Hablemos sobre cómo detener el copiar y pegar entre proyectos y transferir el código a un paquete de plug-in reutilizable Symfony 5. Una serie de artículos que resumen mi experiencia con los paquetes se llevarán a cabo en la práctica desde la creación de un paquete mínimo y la refactorización de una aplicación de demostración para las pruebas y el ciclo de lanzamiento del paquete.


En un artículo anterior , hablamos sobre cómo extender la funcionalidad de un paquete en una aplicación host usando etiquetas. En este artículo, agregamos el paquete de flexibilidad: cree un archivo de configuración y defina varios parámetros.


  • Parámetros del contenedor DI y su redefinición
  • Archivo de configuración del paquete
  • Trabajar con la configuración

Contenido de la serie

Si no está completando el tutorial secuencialmente, descargue la aplicación del repositorio y cambie a la rama de 4 extensiones .


Instrucciones para instalar e iniciar el proyecto en un archivo README.md. Encontrará la versión final del código para este artículo en la rama de 5 configuraciones .


Parámetros del contenedor DI y su redefinición


Ya hay un archivo de configuración dentro del paquete config/services.yaml, donde se determina la configuración de los servicios del contenedor DI. Allí puedes definir los parámetros.


, -.

, . , soft-delete ( , «»). , .


config/services.yaml :


parameters:
    bravik.calendar.enable_soft_delete: true

venodor.package.parameter. snake_case : . , .


EditorController . $enableSoftDelete, false:


public function __construct(
    EventRepository $eventRepository,
    bool $enableSoftDelete = false
) { 
    //... 
}

, services.yaml :


bravik\CalendarBundle\Controller\EditorController:
    arguments:
        $enableSoftDelete: '%bravik.calendar.enable_soft_delete%'

, -   «».  , ,     « »,   .  false,   ,   «-».


services.yaml -. , , !


, :


  1. -, . , - , «  ». , . , ,
  2. -, .

.



: , , , , .

, . Symfony .


config/packages/, , . . , .


.


load() DependencyInjection/CalendarExtension.php :


public function load(array $configs, ContainerBuilder $container) {}

, ContainerBuilder $configs. dd($configs) : .


config/packages/ calendar.yaml:


calendar:                     # extension key
  enable_soft_delete: false

, Symfony config/packages/ . CalendarExtension::load(), Extension-, Extension snake_case. , .


, $configs:


^ array:1 [▼
  0 => array:1 [▼
    "enable_soft_delete" => false
  ]
]

PHP , - . ?


, . packages test, prod dev .


, . , , framework , $configs. .


(extension key) Symfony , load(). .


. 1 , dd($configs) .


:


, ? , .


CalendarExtension Configuration:


<?php
namespace bravik\CalendarBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder('calendar');

        $treeBuilder->getRootNode()
            ->children()
                ->booleanNode('enable_soft_delete')->end()
            ->end()
        ;

        return $treeBuilder;
    }
}

TreeBuilder, , enable_soft_delete boolean.


TreeBuilder , , . , , .

, CalendarExtension::load() :


public function load(array $configs, ContainerBuilder $container)
{
    //...
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);
}

processConfiguration() , Configuration, , , $config.


$config, .


, :


$container->setParameter(
    'bravik.calendar.enable_soft_delete',
    $config['enable_soft_delete']
);

, bravik.calendar.enable_soft_delete config/service.yaml.


   , «»   .


services.yaml bravik.calendar.enable_soft_delete. enable_soft_delete :


//$container->setParameter(
//    'bravik.calendar.enable_soft_delete',
//    $config['enable_soft_delete']
//);

$definition = $container->getDefinition(EditorController::class);
$definition->setArguments([
  '$enableSoftDelete' => $config['enable_soft_delete'],
]);


, , .


true/false :


Exception: Invalid type for path "calendar.enable_soft_delete". Expected boolean, but got string.

, ,


Exception: Undefined index: enable_soft_delete

: . . Configuration.


$treeBuilder->getRootNode()
    ->children()
        ->booleanNode('enable_soft_delete')
            ->defaultValue(false)
//            ->defaultFalse() //    booleanNode()
        ->end()
    ->end()
;

, , . :


$treeBuilder->getRootNode()
    ->children()
        ->booleanNode('enable_soft_delete')
            ->isRequired()
        ->end()
    ->end()
;

, . , deprecated.


. Symfony bin/console config:dump calendar, .


$treeBuilder->getRootNode()
    ->children()
        ->booleanNode('enable_soft_delete')
            ->isRequired()
            ->setDeprecated()
            ->info('Enables soft delete mode for articles. Articles would be marked as `archived` instead of deletion')
        ->end()
    ->end()
;

:


calendar:
    limits:
      per_day: 10
      per_month: 100

$treeBuilder->getRootNode()
    ->children()
        ->arrayNode('limits')
            ->addDefaultsIfNotSet()
            ->children()
                ->integerNode('per_day')
                    ->defaultValue(10)
                    ->validate()
                        ->ifTrue(function ($v) { return $v <= 0; })
                        ->thenInvalid('Number must be positive')
                    ->end()
                ->end()
                ->integerNode('per_month')
                    ->defaultValue(100)
                    ->validate()
                        ->ifTrue(function ($v) { return $v <= 0; })
                        ->thenInvalid('Number must be positive')
                    ->end()
                ->end()
            ->end()
        ->end()
    ->end()
    ;

. : .


Symfony , .

: .


c , . .


:


calendar:
    available_locales:
          locales:
              - { code: 'en', label: 'English' }
              - { code: 'ru', label: '' }

$treeBuilder->getRootNode()
    ->children()
        ->arrayNode('locales')
            ->addDefaultChildrenIfNoneSet()
            ->arrayPrototype()
                ->children()
                    ->scalarNode('code')
                        ->defaultValue('ru')
                    ->end()
                    ->scalarNode('label')
                        ->defaultValue('')
                    ->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

-, .


. .



, , Symfony .


, — . , .


5-configuration.


Symfony .


:


Parte 1. El paquete mínimo
Parte 2. Sacamos el código y las plantillas en el paquete
Parte 3. Integración del paquete con el host: plantillas, estilos, JS
Parte 4. Interfaz para expandir el paquete
Parte 5. Parámetros y configuración
Parte 6. Pruebas, microaplicación dentro del paquete
Parte 7 Ciclo de lanzamiento, instalación y actualización.


All Articles