Login to bookmark this video
Buy Access to Course
11.

Utilizar la configuración del bundle

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

En nuestro bundle, hemos definido y validado la opción de configuración translation_class. En nuestra aplicación, la hemos configurado como App\Entity\Translation. Ahora tenemos que utilizarla en el servicio ObjectTranslator de nuestro bundle.

ObjectTranslator Actualiza

Abre esta clase y añádela al constructor como private string $translationClass:

// ... lines 1 - 6
final class ObjectTranslator
{
public function __construct(
// ... lines 10 - 11
private string $translationClass,
) {
}
// ... lines 15 - 34
}

Espera al navegador y haz clic en un artículo. Aparece un error: "Demasiados pocos argumentos para ... ObjectTranslator::__construct(), 2 pasados... 3 esperados".

abstract_arg()

Vamos a solucionarlo. Abre el config/services.php de nuestro bundle. Tenemos que añadirlo como tercer elemento en esta matriz args(). Pero... aquí no tenemos acceso a nuestra configuración. De momento, podemos hacerlo con una función especial:abstract_arg(). Para el primer argumento, describe su propósito: "Clase de traducción":

// ... lines 1 - 6
return static function (ContainerConfigurator $container): void {
$container->services()
->set('symfonycasts.object_translator', ObjectTranslator::class)
->args([
// ... lines 11 - 12
abstract_arg('translation class')
])
// ... lines 15 - 16
;
};

Esto no es estrictamente necesario, pero ayuda con la depuración. Básicamente estamos haciendo saber a Symfony que aún necesitamos configurar este argumento.

De vuelta en el navegador, actualiza. Un nuevo error: "Argumento 3 del servicio ...object_translator es abstracto". Y vemos nuestra descripción: "Clase de traducción". ¡Perfecto!

Utilizar la configuración del bundle

Ahora... tenemos que encontrar el lugar donde tenemos acceso a la configuración del bundle.

En ObjectTranslationBundle::loadExtension(), fíjate en el argumento array $config. Dentro de este método, vuélcalo con: dd($config):

// ... lines 1 - 11
final class ObjectTranslationBundle extends AbstractBundle
{
// ... lines 14 - 40
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
dd($config);
// ... lines 44 - 45
}
}

De vuelta en el navegador, actualiza.

¡Qué bien! ¡Aquí está nuestra configuración procesada como un array! ¡Es hora de ponerla en práctica!

Debajo de la importación, escribe $builder->getDefinition(). Asegúrate de utilizar getDefinition(), no get(). Dentro, pasa el ID de servicio de nuestro servicio ObjectTranslator:symfonycasts.object_translator:

// ... lines 1 - 11
final class ObjectTranslationBundle extends AbstractBundle
{
// ... lines 14 - 40
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
// ... lines 43 - 44
$builder->getDefinition('symfonycasts.object_translator')
// ... line 46
;
}
}

Una de las ventajas de trabajar en tu bundle dentro de una app es que puedes obtener autocompletado de PhpStorm + plugin Symfony para tus servicios.

A continuación, encadena ->setArgument(). El primer argumento aquí es el índice basado en 0 del argumento del constructor que queremos establecer. Salta rápidamente a ObjectTranslator,$translationClass es el tercer argumento, así que tenemos que pasar 2.

El segundo argumento es el valor que queremos establecer: $config['translation_class']:

// ... lines 1 - 11
final class ObjectTranslationBundle extends AbstractBundle
{
// ... lines 14 - 40
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
// ... lines 43 - 44
$builder->getDefinition('symfonycasts.object_translator')
->setArgument(2, $config['translation_class'])
;
}
}

Vuelve a tu navegador y actualízalo. ¡Muy bien! No hay errores.

Asegurémonos de que se le ha dado el valor que esperamos. Abre ArticleController::show()y dd($translator):

40 lines | src/Controller/ArticleController.php
// ... lines 1 - 11
final class ArticleController extends AbstractController
{
// ... lines 14 - 22
#[Route('/news/{slug:article}', name: 'app_article_show')]
public function show(Article $article, ObjectTranslator $translator): Response
{
dd($translator);
// ... lines 27 - 37
}
}

De nuevo en el navegador... actualiza. ¡Qué bien! Aquí está nuestro objeto ObjectTranslator y, efectivamente, la propiedad translationClass está establecida en App\Entity\Translation.

Elimina el dd(), actualiza y ¡ya estamos listos para continuar!

A continuación, empecemos a escribir nuestra lógica de traducción en ObjectTranslator.