22.

Configuración previa

|

Share this awesome video!

|

Estoy bastante seguro de que nuestro nuevo item_view está configurado correctamente. Tenemositem\value_type: contentful_entry, que sé que es correcto... y luego estamos utilizando contentful\content_type ajustado a skill para que esto sólo afecte a las habilidades:

41 lines | config/packages/netgen_layouts.yaml
netgen_layouts:
// ... lines 2 - 12
view:
item_view:
// ... lines 15 - 21
# default = frontend
default:
// ... lines 24 - 28
contentful_entry/skill:
template: '@nglayouts/item/contentful_entry/skill.html.twig'
match:
item\value_type: 'contentful_entry'
contentful\content_type: 'skill'
// ... lines 34 - 41

Pero... parece que no funciona en el frontend. Antes, cuando ejecutamosdebug:config, vimos que el problema reside en el orden de la configuración. Layouts lee de arriba abajo cuando decide qué "vista" utilizar. Así que mira ésta primero, ve que la value_type es contentful_entry... y simplemente se detiene. Para solucionarlo, tenemos que invertir nuestra configuración.

Vale, entonces... ¿por qué está en este orden para empezar? ¿Por qué nuestra configuración aparece al final? Esto se debe a la forma en que Symfony carga la configuración: primero carga la configuración del bundle - como la del paquete Contentful o Layouts - y luego carga nuestros archivos de configuración. Y ese suele ser el orden que queremos Nos permite anular la configuración establecida en los bundles.

Pero en este caso, queremos lo contrario. ¿Cómo lo conseguimos? Pidiendo a Symfony que preañada nuestra configuración.

Configurar el Prepend

En el directorio config/, crea un nuevo directorio llamado prepends/y mueve la configuración de Netgen Layouts a él. Esto evitará que Symfony cargue ese archivo de la forma normal: vamos a cargarlo manualmente.

El siguiente paso es un poco técnico. En src/, crea una clase "extensión" llamada, qué tal, AppExtension. Voy a pegar el código: puedes cogerlo del bloque de código de esta página:

25 lines | src/AppExtension.php
// ... lines 1 - 2
namespace App;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\Yaml\Yaml;
class AppExtension extends Extension implements PrependExtensionInterface
{
public function load(array $configs, ContainerBuilder $container)
{
}
public function prepend(ContainerBuilder $container)
{
$configFile = __DIR__ . '/../config/prepends/netgen_layouts.yaml';
$config = Yaml::parse((string) file_get_contents($configFile));
$container->prependExtensionConfig('netgen_layouts', $config['netgen_layouts']);
$container->addResource(new FileResource($configFile));
}
}

Esto carga nuestro archivo de configuración de forma normal... excepto que se le añadirá una extensión.

Paso final. Para llamar a este método, abre la clase Kernel. Después deuse MicroKernelTrait, añade configureContainer as baseConfigureContainer:

22 lines | src/Kernel.php
// ... lines 1 - 10
class Kernel extends BaseKernel
{
use MicroKernelTrait { configureContainer as baseConfigureContainer; }
// ... lines 14 - 20
}

Esto añade el método configureContainer de MicroKernelTrait a esta clase como haría normalmente un trait... excepto que lo renombra abaseConfigureContainer. Hacemos esto para poder definir nuestro propio métodoconfigureContainer(). Copia la firma configureContainer() del trait, pégala, pulsa "OK" para añadir las sentencias use y luego llama a$this->baseConfigureContainer() pasando por $container, $loader y $builder:

22 lines | src/Kernel.php
// ... lines 1 - 5
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
// ... lines 9 - 10
class Kernel extends BaseKernel
{
// ... lines 13 - 14
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void
{
$this->baseConfigureContainer($container, $loader, $builder);
// ... lines 18 - 19
}
}

El método configureContainer() del trait se encarga de cargarservices.yaml y todos los archivos de config/packages/. Todo eso son cosas buenas que queremos seguir haciendo. Pero después de hacer eso, añade una cosa más: $builder->registerExtension(new AppExtension()):

22 lines | src/Kernel.php
// ... lines 1 - 10
class Kernel extends BaseKernel
{
// ... lines 13 - 14
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void
{
$this->baseConfigureContainer($container, $loader, $builder);
$builder->registerExtension(new AppExtension());
}
}

De nuevo, sí, esto es fastidiosamente técnico. Pero gracias a estas dos piezas, nuestra configuraciónnetgen_layouts.yaml estará preconfigurada.

¡Compruébalo! Vuelve a ejecutar el comando debug:config:

php ./bin/console debug:config netgen_layouts view.item_view

Desplázate hacia arriba y... ¡sí! ¡Nuestra configuración está ahora arriba! Y cuando actualizamos... ¡woohoo! ¡Vemos el texto!

A continuación: vamos a hacer que esta plantilla se muestre exactamente igual que las habilidades codificadas. A continuación, crearemos una segunda plantilla de elementos para personalizar la representación del tipo de contenido "Anuncio" de Contentful.