This course is still being released! Check back later for more chapters.

Get Notified About this Course!

We will send you messages regarding this course only
and nothing else, we promise.
You can unsubscribe anytime by emailing us at:
privacy@symfonycasts.com
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.