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
BlockLibraryControllerclase 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ónArrayPara utilizar la inyección de dependencia, su clase necesita implementar una
ContainerInjectionInterfaceinterfaz.ContainerInjectionInterfacemandatos 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
ContainerInjectionInterfaceno es necesario en este caso ya queControllerBaseya lo implementa.fuente
ControllerBase; no es necesario implementarContainerInjectionInterfaceya 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