W moim module używam poniższego kodu do uzyskania aliasu adresu URL danego adresu:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Ale w moim module uruchamiam automatyczną recenzję ( http://pareview.sh/ ). Pojawia się poniżej ostrzeżenie:
16 | OSTRZEŻENIE | \ Wywołania Drupala należy unikać w klasach, zamiast tego należy stosować wstrzykiwanie zależności
Jak mogę zaktualizować powyższy kod za pomocą wstrzykiwania zależności? Cały mój kod klasy podano poniżej.
<?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
BIEG
źródło
źródło
Odpowiedzi:
Weź
BlockLibraryController
klasę jako przykład; rozszerza tę samą klasę, co twój kontroler.Ty definiujesz:
create()
Metoda statyczna i publiczna , która pobiera wartości z kontenera zależności i tworzy nowy obiekt twojej klasyW twoim przypadku kod byłby podobny do następującego.
Nie zapomnij umieścić
use \Drupal\Core\Path\AliasManagerInterface;
na wierzchu pliku zawierającego wyświetlany kod.Na marginesie, kod użyty do renderowania widoku jest niepoprawny: Nie musisz go używać,
drupal_render()
ponieważviews_embed_view()
już zwraca tablicę do renderowania.Następnie zwracana tablica renderowania prawdopodobnie nie zapewnia oczekiwanego wyniku. #nazwa prawdopodobnie nie będzie używana z Drupala, a #markup filtruje przekazane do niego znaczniki, jak opisano w przeglądzie API renderingu .
źródło
views_embed_view()
powróci.views_embed_view()
pokazującyArray
Aby wykorzystać wstrzykiwanie zależności, klasa musi implementować
ContainerInjectionInterface
interfejs.ContainerInjectionInterface
nakazuje, że klasa implementująca musi miećcreate()
metodę. Dzięki dodatkowemu konstruktorowi klasy, który akceptuje wstrzykiwane zależności,create()
metoda zwraca instancję klasy, przekazując zdefiniowane instancje zależności do klasy.Aktualizacja: słusznie wskazał @kiamlaluno, który
ContainerInjectionInterface
nie jest wymagany w tym przypadku, ponieważControllerBase
już go implementuje.źródło
ControllerBase
; wdrożenie nie jest konieczne,ContainerInjectionInterface
ponieważ zostało to już zrobioneControllerBase
.Innym rozwiązaniem jest rozwiązanie problemu. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
źródło