In meinem Modul verwende ich den folgenden Code, um den URL-Alias der angegebenen URL zu erhalten:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Bei einem Modul, für das ich Automated Review ( http://pareview.sh/ ) ausführe , wird die folgende Warnung angezeigt:
16 | WARNUNG | \ Drupal-Aufrufe sollten in Klassen vermieden werden. Verwenden Sie stattdessen die Abhängigkeitsinjektion
Wie kann ich den obigen Code mithilfe der Abhängigkeitsinjektion aktualisieren? Mein gesamter Klassencode ist unten angegeben.
<?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
quelle
quelle
Antworten:
Nehmen Sie die
BlockLibraryController
Klasse als Beispiel. Es erweitert die gleiche Klasse wie Ihr Controller.Sie definieren:
create()
Methode, die die Werte aus dem Abhängigkeitscontainer abruft und ein neues Objekt Ihrer Klasse erstelltIn Ihrem Fall ähnelt der Code dem folgenden.
Vergessen Sie nicht,
use \Drupal\Core\Path\AliasManagerInterface;
den Kopf der Datei mit dem angezeigten Code zu setzen.Als Randnotiz ist der Code, den Sie zum Rendern der Ansicht verwenden, falsch: Sie müssen ihn nicht verwenden,
drupal_render()
daviews_embed_view()
bereits ein wiedergebbares Array zurückgegeben wird.Dann liefert das zurückgegebene Render-Array wahrscheinlich nicht die erwartete Ausgabe. #name wird in Drupal wahrscheinlich nicht verwendet, und #markup filtert das Markup, das Sie an ihn übergeben, wie in der Render-API-Übersicht beschrieben .
quelle
views_embed_view()
zurückkommt.views_embed_view()
es zeigtArray
Um die Abhängigkeitsinjektion zu verwenden, muss Ihre Klasse eine
ContainerInjectionInterface
Schnittstelle implementieren .ContainerInjectionInterface
gibt vor, dass die implementierende Klasse einecreate()
Methode haben muss. Mit einem zusätzlichen Klassenkonstruktor, der die injizierten Abhängigkeiten akzeptiert, gibt diecreate()
Methode eine Instanz Ihrer Klasse zurück, indem die definierten Instanzen von Abhängigkeiten an Ihre Klasse übergeben werden.Update: Es wurde von @kiamlaluno zu Recht darauf hingewiesen, dass
ContainerInjectionInterface
dies in diesem Fall nicht erforderlich ist, da esControllerBase
bereits implementiert ist.quelle
ControllerBase
; Eine Implementierung ist nicht erforderlich,ContainerInjectionInterface
da dies bereits ab erfolgt istControllerBase
.Es ist anders für das Problem zu lösen. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
quelle