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.