drupal 8 – Validación personalizada de parámetros de ruta

Pregunta:

Tengo algo como lo siguiente en mi archivo .routing.yml :

my.path:
  path: '/my-path/{node}'
  defaults:
    _form: 'Drupal\mymodule\Form\MyForm'
  requirements:
    _entity_access: 'node.update'
    node: \d+

Esto funciona bien, verifica que el usuario tenga permisos para editar el nodo y todo. Ahora, quiero restringir esta ruta para que funcione solo para nodos de cierto tipo de contenido. Idealmente, algo como esto como línea final:

    node.bundle: 'article'   # this doesn't work, of course

¿Cómo puedo hacer esto?

Respuesta:

Podría encontrar tres formas posibles. Supongamos que el nombre de su módulo es un ejemplo y el tipo de contenido que debe verificar es el artículo .

1. Validación del argumento en el generador de formularios

Es la forma más sencilla.

Primero defina su ruta como de costumbre:

ejemplo.routing.yml

 example.node.edit_form:
  path: /example/{node}/edit
  defaults:
    _form: 'Drupal\example\Form\ExampleNodeForm'
  options:
    _node_operation_route: TRUE
    parameters:
      node:
        type: entity:node
  requirements:
    _permission: 'edit any article content'

Luego, simplemente coloque estas líneas en Drupal \ example \ Form \ ExampleNodeForm :: buildForm antes del otro código.

if ($node->getType() != 'article') {
  throw new AccessDeniedHttpException();
}

2. Validar el argumento mediante la devolución de llamada de acceso personalizado

La definición de ruta es la misma que la anterior, excepto la opción custom_access en la sección de requisitos.

ejemplo.routing.yml

 example.node.edit_form:
  path: /example/{node}/edit
  defaults:
    _form: 'Drupal\example\Form\ExampleNodeForm'
  options:
    _node_operation_route: TRUE
    parameters:
      node:
        type: entity:node
  requirements:
    _permission: 'edit any article content'
    _custom_access:  'Drupal\example\Form\ExampleNodeForm::access'

Drupal \ example \ Form \ ExampleNodeForm :: access () debería devolver una instancia de Drupal \ Core \ Access \ AccessResult . Esto puede hacerse de la siguiente manera.

return AccessResult::allowedIf($node->getType() == 'article');

3. Validación del argumento con verificador de acceso

ejemplo.routing.yml

 example.node.edit_form:
  path: /example/{node}/edit
  defaults:
    _form: 'Drupal\example\Form\ExampleNodeForm'
  options:
    _node_operation_route: TRUE
    parameters:
      node:
        type: entity:node
  requirements:
    _permission: 'edit any article content'
    _content_type:  'article'

Como puede ver, esto incluye el requisito _content_type . Para que funcione, debe implementar un servicio de verificación de acceso personalizado.

ejemplo.services.yml

services:
  example.content_type_access_checker:
    class: Drupal\example\Access\ContentTypeAccessCheck
    tags:
      - { name: access_check, applies_to: _content_type }

Drupal \ ejemplo \ src \ Access \ ContentTypeAccessCheck.php

namespace Drupal\example\Access;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Routing\Access\AccessInterface;
use Drupal\node\NodeInterface;
use Symfony\Component\Routing\Route;

/**
 * Checks if node type matches the one provided in the route configuration.
 */
class ContentTypeAccessCheck implements AccessInterface {

  /**
   * Access callback.
   */
  public function access(Route $route, NodeInterface $node) {
    return AccessResult::allowedIf($node->getType() == $route->getRequirement('_content_type'));
  }
}

El último enfoque puede ser útil si desea reutilizar el código de control de acceso en varias rutas.

Documentación: https://www.drupal.org/docs/8/api/routing-system/access-checking-on-routes .

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım