В моем модуле используется код ниже для получения псевдонима URL данного URL:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Но в моем модуле я запускаю Automated Review ( http://pareview.sh/ ), ниже которого выдается предупреждение:
16 | ВНИМАНИЕ | В классах следует избегать вызовов Drupal, вместо этого используйте внедрение зависимостей
Как я могу обновить приведенный выше код с помощью внедрения зависимостей? Весь мой код класса приведен ниже.
<?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>',
);
}
}
Ответы:
Возьмите
BlockLibraryController
класс в качестве примера; он расширяет тот же класс, что и ваш контроллер.Вы определяете:
create()
метод, который получает значения из контейнера зависимостей и создает новый объект вашего класса.В вашем случае код будет похож на следующий.
Не забудьте поместить
use \Drupal\Core\Path\AliasManagerInterface;
в начало файла, содержащего код, который вы показываете.Как примечание: код, который вы используете для визуализации представления, неверен: вам не нужно его использовать,
drupal_render()
потому что онviews_embed_view()
уже возвращает рендеринг-массив.Тогда возвращаемый массив рендеринга, вероятно, не дает ожидаемого результата. #name, вероятно, не будет использоваться из Drupal, и #markup фильтрует разметку, которую вы ему передаете, как описано в обзоре Render API .
источник
views_embed_view()
вернул.views_embed_view()
этого показаArray
Чтобы использовать внедрение зависимостей, ваш класс должен реализовать
ContainerInjectionInterface
интерфейс.ContainerInjectionInterface
требует, чтобы у реализующего класса былcreate()
метод. С дополнительным конструктором класса, который принимает введенные зависимости,create()
метод возвращает экземпляр вашего класса, передавая определенные экземпляры зависимостей вашему классу.Обновление: @kiamlaluno по праву указал, что
ContainerInjectionInterface
в этом случае не требуется, поскольку онControllerBase
уже реализован.источник
ControllerBase
; это не нужно реализовывать,ContainerInjectionInterface
поскольку это уже сделано изControllerBase
.Это другое для решения проблемы. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
источник