En mi módulo, uso el siguiente código para obtener el alias de la URL dada:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Pero una vez que ejecuto la Revisión automatizada ( http://pareview.sh/ ) en mi módulo, recibo la siguiente advertencia:
16 ADVERTENCIA | \ Las llamadas de Drupal deben evitarse en las clases, utilice la inyección de dependencia
¿Cómo puedo actualizar el código anterior usando la inyección de dependencia? Mi código de clase completo se da a continuación.
<?php
namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
/**
* MyModule Class defines ajax callback function.
*/
class MyModule extends ControllerBase {
/**
* Callback function for ajax request.
*/
public function getUserContent() {
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
$alias = explode('/', $alias);
$my_module_views = views_embed_view('my_module', 'default', $alias[2]);
$my_module= drupal_render($my_module_views);
return array(
'#name' => 'my_module_content',
'#markup' => '<div class="my_module_content">' . $my_module. '</div>',
);
}
}
8
dependency-injection
ARUN
fuente
fuente
Respuestas:
Toma la
BlockLibraryController
clase como ejemplo; extiende la misma clase que su controlador.Usted define:
create()
método público y estático que obtiene los valores del contenedor de dependencias y crea un nuevo objeto de su clase.En su caso, el código sería similar al siguiente.
No olvide poner
use \Drupal\Core\Path\AliasManagerInterface;
en la parte superior del archivo que contiene el código que está mostrando.Como nota al margen, el código que usa para representar la vista es incorrecto: no necesita usarlo
drupal_render()
porqueviews_embed_view()
ya devuelve una matriz renderizable.Entonces, la matriz de renderizado que está devolviendo probablemente no esté dando el resultado que espera. #name probablemente no se utilizará desde Drupal, y #markup filtra el marcado que le está pasando, como se describe en la descripción general de la API Render .
fuente
views_embed_view()
vuelve.views_embed_view()
su presentaciónArray
Para utilizar la inyección de dependencia, su clase necesita implementar una
ContainerInjectionInterface
interfaz.ContainerInjectionInterface
mandatos que implementando la clase tiene que tenercreate()
método. Con un constructor de clase adicional que acepta las dependencias inyectadas, elcreate()
método devuelve una instancia de su clase al pasar las instancias definidas de dependencias a su clase.Actualización: @kiamlaluno señaló acertadamente que
ContainerInjectionInterface
no es necesario en este caso ya queControllerBase
ya lo implementa.fuente
ControllerBase
; no es necesario implementarContainerInjectionInterface
ya que eso ya se hizo desdeControllerBase
.Es otro para resolver el problema. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
fuente