Pregunta:
En mi módulo usando el siguiente código para obtener el alias de URL de la URL dada:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Pero una que ejecuto Automated Review ( http://pareview.sh/ ) en mi módulo, recibo la siguiente advertencia:
16 | ADVERTENCIA | \ Las llamadas a Drupal deben evitarse en las clases, use la inyección de dependencia en su lugar
¿Cómo puedo actualizar el código anterior usando la inyección de dependencia? Mi código de clase completo se da a continuación.
<?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>',
);
}
}
Respuesta:
Tome la clase BlockLibraryController
como ejemplo; extiende la misma clase que su controlador.
Tu defines:
- Un método
create()
estático y público que obtiene los valores del contenedor de dependencia y crea un nuevo objeto de su clase - Un constructor de clases que guarda los valores pasados del método anterior en las propiedades del objeto.
- Un conjunto de propiedades de objeto para guardar los valores pasados en el constructor de la clase.
En su caso, el código sería similar al siguiente.
class MyModuleController extends ControllerBase {
/**
* The path alias manager.
*
* @var \Drupal\Core\Path\AliasManagerInterface
*/
protected aliasManager;
/**
* Constructs a MyModuleController object.
*
* @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
* The path alias manager.
*/
public function __construct(AliasManagerInterface $alias_manager) {
$this->aliasManager = $alias_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('path.alias_manager')
);
}
/**
* {@inheritdoc}
*/
public function getUserContent() {
$alias = $this->aliasManager->getPathByAlias($_POST['url']);
// Omissis.
}
}
No olvide poner use \Drupal\Core\Path\AliasManagerInterface;
en la parte superior del archivo que contiene el código que está mostrando.
Como nota al margen, el código que usa para renderizar la vista es incorrecto: no necesita usar drupal_render()
porque views_embed_view()
ya devuelve una matriz renderizable.
Entonces, la matriz de renderización que está devolviendo probablemente no esté dando el resultado que espera. #name probablemente no se usará desde Drupal, y #markup filtra el marcado que le está pasando, como se describe en la descripción general de Render API .
#markup : especifica que la matriz proporciona marcado HTML directamente. A menos que el marcado sea muy simple, como una explicación en una etiqueta de párrafo, normalmente es preferible usar #theme o #type en su lugar, para que el tema pueda personalizar el marcado. Tenga en cuenta que el valor se pasa a través de
\Drupal\Component\Utility\Xss::filterAdmin()
, que\Drupal\Component\Utility\Xss::filterAdmin()
los vectores XSS conocidos y permite una lista permisiva de etiquetas HTML que no son vectores XSS. (Es decir,<script>
y<style>
no están permitidos.) Consulte\Drupal\Component\Utility\Xss::$adminTags
para ver la lista de etiquetas que se permitirán. Si su marcado necesita alguna de las etiquetas que no están en esta lista blanca, entonces puede implementar un gancho de tema y un archivo de plantilla y / o una biblioteca de activos. Alternativamente, puede usar la clave de matriz de renderizado #allowed_tags para modificar qué etiquetas se filtran.#allowed_tags : si se proporciona #markup, se puede utilizar para cambiar qué etiquetas se utilizan para filtrar el marcado. El valor debe ser una matriz de etiquetas que
Xss::filter()
. Si se establece #plain_text, este valor se ignora.