Configuración previa
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:
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:
// ... 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
:
// ... 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
:
// ... 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())
:
// ... 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.