Mejor práctica: $ this-> t () versus t ()

10

Estoy buscando una mejor práctica: ¿deberían usar los módulos contribuidos $this->t()o t()?

Wim Mostrey
fuente
Prefiero usar StringTranslationTrait: t porque es más fácil burlarse del string_translationservicio.
mradcliffe

Respuestas:

24

La mejor práctica depende de dónde se coloca el código.

Código OOP

Uso $this->t().

Si extiende una clase base de drupal como un controlador o un complemento, la función t () se proporciona como método de clase $this->t()fuera de la caja y debe usarla. Esto hace que su código sea comprobable.

Para la mayoría de las tareas, encontrará una clase de drupal adecuada para extender desde la que se ha $this->t()definido, pero si necesita construir su propia clase desde cero, la mejor práctica sería usar el rasgo de traducción de cadena e inyectarlo como servicio si usa esta clase en un contexto de servicio:

use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
class MyClass {
  use StringTranslationTrait;

  /**
   * Constructs a MyClass object.
   *
   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
   *   The string translation service.
   */
  public function __construct(TranslationInterface $string_translation) {
    // You can skip injecting this service, the trait will fall back to \Drupal::translation()
    // but it is recommended to do so, for easier testability,
    $this->stringTranslation = $string_translation;
  }

  /**
   * Does something.
   */
  public function doSth() {
    // ...
    $string = $this->t('Something');
    // ...
  }

}

Fuente: https://www.drupal.org/docs/8/api/translation-api-code-text

Código de procedimiento

Uso t().

Si tiene un código de procedimiento, por ejemplo, un enlace, use t(), que es una función global.

La mejor práctica no sería utilizar el procedimiento t()en el Código OOP.

4k4
fuente
1
Tenga en cuenta que al extender algunos tipos de clases, por ejemplo, extender ControllerBase al crear un controlador, $ this-> t () ya se proporciona sin necesidad de usar StringTranslationTrait.
Jaypan
Sí, hay muchas clases base que proporcionan $this->t()de fábrica, hay más de cien en el núcleo. El ejemplo de código solo es necesario si no se extiende desde una de estas clases.
4k4
¿Y qué pasa con el caso cuando desarrollamos un comando drush? ¿Deberíamos usar StringTranslationTrait o drush una función específica dt ()?
Артем Ильин
Esa es una gran explicación. ¿Por qué necesitamos esto use StringTranslationTrait;dentro de la clase?
David
Es mejor usar$this->setStringTranslation($string_translation);
mpp
4

La mejor práctica es usar $ this-> t (), en lugar de t (). El uso del módulo no cambiará, sin embargo, con la llegada de Drupal 8, ahora tenemos pruebas PHPUnit integradas en el núcleo. Las pruebas de PHPUnit permiten que se escriban pruebas para confirmar que todo funciona, de modo que cada vez que se cambia el código, las pruebas se pueden ejecutar para garantizar que no se haya roto nada. La relevancia de esto es que las pruebas de prueba de PHPUnit solo se realizan contra una sola clase (también conocida como una unidad), lo que significa que el núcleo no se inicia para estas pruebas. Por lo tanto, las funciones globales como t () no existen, y arrojarán un error, evitando que se ejecuten las pruebas.

Si nunca crea pruebas unitarias, nunca verá la diferencia entre usar t () y $ this-> t (), sin embargo, crear pruebas también es una práctica recomendada y, por lo tanto, si realmente quiere hacer las cosas bien, deberías usar $ this-> t () y crear pruebas de Unidad para cada una de tus clases.

* Editar *

Actualización después de leer la publicación de 4k4.

Mis comentarios anteriores solo se refieren al código OOP, no al código de procedimiento. El código de procedimiento no se prueba unitariamente, ni tiene el constructor $ this. En el código de procedimiento, t () es correcto.

Jaypan
fuente
Excelente explicación! Por cierto, deseando leer tu libro.
No Sssweat