Dans mon module, utilisez le code ci-dessous pour obtenir l'alias d'URL d'une URL donnée:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Mais celui que j'exécute Automated Review ( http://pareview.sh/ ) dans mon module, je reçois ci-dessous l'avertissement:
16 | AVERTISSEMENT | \ Les appels Drupal doivent être évités dans les classes, utilisez plutôt l'injection de dépendances
Comment puis-je mettre à jour le code ci-dessus en utilisant l'injection de dépendance? Mon code de classe entier est donné ci-dessous.
<?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>',
);
}
}
Réponses:
Prenons l'
BlockLibraryController
exemple de la classe; il étend la même classe que votre contrôleur.Vous définissez:
create()
méthode statique et publique qui obtient les valeurs du conteneur de dépendances et crée un nouvel objet de votre classeDans votre cas, le code serait similaire au suivant.
N'oubliez pas de mettre
use \Drupal\Core\Path\AliasManagerInterface;
en haut du fichier contenant le code que vous montrez.En remarque, le code que vous utilisez pour rendre la vue est incorrect: vous n'avez pas besoin de l'utiliser
drupal_render()
car ilviews_embed_view()
retourne déjà un tableau pouvant être rendu.Ensuite, le tableau de rendu que vous renvoyez ne donne probablement pas la sortie attendue. #name ne sera probablement pas utilisé depuis Drupal, et #markup filtre le balisage que vous lui passez, comme décrit dans la présentation de l'API Render .
la source
views_embed_view()
revient.views_embed_view()
celui - ci montrantArray
Afin d'utiliser l'injection de dépendances, votre classe doit implémenter une
ContainerInjectionInterface
interface.ContainerInjectionInterface
exige que la classe d'implémentation ait unecreate()
méthode. Avec un constructeur de classe supplémentaire qui accepte les dépendances injectées, lacreate()
méthode retourne une instance de votre classe en passant les instances définies de dépendances à votre classe.Mise à jour: Il a été souligné à juste titre par @kiamlaluno qui
ContainerInjectionInterface
n'est pas requis dans ce cas carControllerBase
il l'implémente déjà.la source
ControllerBase
; il n'est pas nécessaire de l'implémenterContainerInjectionInterface
puisque cela se fait déjà depuisControllerBase
.C'est autre pour résoudre le problème. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
la source