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
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 -. , , !
, :
- -, . , - , « ». , . , ,
- -, .
.
: , , , , .
, . 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 :
$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)
->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.