¿Cuál es la diferencia entre usar $ this-> t ('text') y t ('text') en un complemento de bloque

7

He notado en muchos tutoriales para construir complementos de bloque,

$this->t('text')

se usa para crear texto traducible, especialmente en la función de forma de bloque. Sin embargo usando

t('text') 

No produce ningún error. ¿Hay alguna diferencia entre usar cualquiera de estos? Y si no lo hay, ¿cuál es la mejor práctica?

Mate
fuente

Respuestas:

6

Para ser exactos en su pregunta: no hay diferencia en la implementación interna.

Pero como práctica recomendada , debe usar en $this->tlugar de lo global tsiempre que sea posible. Si marca la función, testá devolviendo un nuevo objeto TranslateableMarkup .

Si su clase dice $this->tque no está definido, puede agregar StringTranslationTrait para agregar el comportamiento o inyectarlo como una dependencia.

El uso de este rasgo agregará los métodos t () y formatPlural () a la clase. Deben usarse para cada cadena traducible, de forma similar a cómo el código de procedimiento debe usar las funciones globales t () y \ Drupal :: translation () -> formatPlural (). Esto permite que las herramientas de extracción de cadenas encuentren cadenas traducibles.

Si la clase es capaz de inyectar servicios desde el contenedor, debería inyectar el servicio 'string_translation' y asignarlo a $ this-> stringTranslation.

Por lo tanto, como regla de mejores prácticas, generalmente no desea mezclar procedimientos dentro de OOP a menos que sea completamente inevitable (por ejemplo, funciones nativas de PHP).

Kevin
fuente
4

La documentación para t () establece:

Cuando sea posible, use el \Drupal\Core\StringTranslation\StringTranslationTrait::t(). De lo contrario, cree un nuevo \Drupal\Core\StringTranslation\TranslatableMarkupobjeto directamente.

No explica la razón de esto, pero si mira el comentario en la página de documentación , le dará una razón para usar ese método de rasgo, o esa clase.

Las clases se pueden probar individualmente con PHPUnit, que se ejecuta sin núcleo de arranque, pero la t()función solo está disponible cuando se arranca el núcleo.
El uso $this->t()y StringTranslationTraitpermite que la traducción se burle, por lo que la clase se puede probar de forma aislada con PHPUnit.

kiamlaluno
fuente