No meu módulo, usando o código abaixo para obter o alias de URL de um determinado URL:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Mas eu executo a Revisão automatizada ( http://pareview.sh/ ) no meu módulo e estou recebendo o aviso abaixo:
16 ATENÇÃO | \ Chamadas de Drupal devem ser evitadas nas classes, use a injeção de dependência em vez disso
Como posso atualizar o código acima usando injeção de dependência? Meu código de turma inteiro é fornecido abaixo.
<?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
UMA CORRIDA
fonte
fonte
Respostas:
Tome a
BlockLibraryController
classe como exemplo; estende a mesma classe que seu controlador.Você define:
create()
método estático e público que obtém os valores do contêiner de dependência e cria um novo objeto da sua classeNo seu caso, o código seria semelhante ao seguinte.
Não se esqueça de colocar
use \Drupal\Core\Path\AliasManagerInterface;
na parte superior do arquivo que contém o código que você está mostrando.Como observação lateral, o código que você usa para renderizar a exibição está errado: você não precisa usá-lo
drupal_render()
porqueviews_embed_view()
já retorna uma matriz renderizável.Então, a matriz de renderização que você está retornando provavelmente não está dando a saída que você espera. #name provavelmente não será usado no Drupal e #markup filtra a marcação que você está passando, conforme descrito na visão geral da API de renderização .
fonte
views_embed_view()
retorna.views_embed_view()
exibiçãoArray
Para utilizar a injeção de dependência, sua classe precisa implementar a
ContainerInjectionInterface
interface.ContainerInjectionInterface
exige que a classe de implementação tenha que tercreate()
método. Com o construtor de classe adicional que aceita as dependências injetadas, ocreate()
método retorna uma instância da sua classe passando as instâncias definidas das dependências para a sua classe.Atualização: foi justamente apontado pelo @kiamlaluno que
ContainerInjectionInterface
não é necessário neste caso, poisControllerBase
já o implementa.fonte
ControllerBase
; não é necessário implementar,ContainerInjectionInterface
pois isso já foi feitoControllerBase
.É outro para resolver o problema. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
fonte