Flag of Ukraine
SymfonyCasts stands united with the people of Ukraine

Configuración previa

Video not working?

It looks like your browser may not support the H264 codec. If you're using Linux, try a different browser or try installing the gstreamer0.10-ffmpeg gstreamer0.10-plugins-good packages.

Thanks! This saves us from needing to use Flash or encode videos in multiple formats. And that let's us get back to making more videos :). But as always, please feel free to message us.

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:

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.

Leave a comment!

0
Login or Register to join the conversation
Cat in space

"Houston: no signs of life"
Start the conversation!

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=8.1.0",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "babdev/pagerfanta-bundle": "^3.7", // v3.7.0
        "doctrine/doctrine-bundle": "^2.7", // 2.7.0
        "doctrine/doctrine-migrations-bundle": "^3.2", // 3.2.2
        "doctrine/orm": "^2.13", // 2.13.3
        "easycorp/easyadmin-bundle": "^4.4", // v4.4.1
        "netgen/layouts-contentful": "^1.3", // 1.3.2
        "netgen/layouts-standard": "^1.3", // 1.3.1
        "pagerfanta/doctrine-orm-adapter": "^3.6",
        "sensio/framework-extra-bundle": "^6.2", // v6.2.8
        "stof/doctrine-extensions-bundle": "^1.7", // v1.7.0
        "symfony/console": "5.4.*", // v5.4.14
        "symfony/dotenv": "5.4.*", // v5.4.5
        "symfony/flex": "^1.17|^2", // v2.2.3
        "symfony/framework-bundle": "5.4.*", // v5.4.14
        "symfony/monolog-bundle": "^3.0", // v3.8.0
        "symfony/proxy-manager-bridge": "5.4.*", // v5.4.6
        "symfony/runtime": "5.4.*", // v5.4.11
        "symfony/security-bundle": "5.4.*", // v5.4.11
        "symfony/twig-bundle": "5.4.*", // v5.4.8
        "symfony/ux-live-component": "^2.x-dev", // 2.x-dev
        "symfony/ux-twig-component": "^2.x-dev", // 2.x-dev
        "symfony/validator": "5.4.*", // v5.4.14
        "symfony/webpack-encore-bundle": "^1.15", // v1.16.0
        "symfony/yaml": "5.4.*", // v5.4.14
        "twig/extra-bundle": "^2.12|^3.0", // v3.4.0
        "twig/twig": "^2.12|^3.0" // v3.4.3
    },
    "require-dev": {
        "doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.2
        "symfony/debug-bundle": "5.4.*", // v5.4.11
        "symfony/maker-bundle": "^1.47", // v1.47.0
        "symfony/stopwatch": "5.4.*", // v5.4.13
        "symfony/web-profiler-bundle": "5.4.*", // v5.4.14
        "zenstruck/foundry": "^1.22" // v1.22.1
    }
}
userVoice