Estoy tratando de devolver la página 404 en lugar de la respuesta 403 para nodos no publicados en Drupal 8.
Probé suscriptor respuesta kernel , pero encontré el código que estaba usando solamente cambiaría el código de estado a partir de 404 403, en realidad no mostrar la página 404. Entonces, ¿tal vez alguien pueda mostrarme cómo generar un objeto de respuesta de 404 páginas allí?
Este es el código que estaba usando:
class ResponseSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [KernelEvents::RESPONSE => [['alterResponse']]];
}
/**
* Change status code to 404 from 403 if page is an unpublished node.
*
* @param FilterResponseEvent $event
* The route building event.
*/
public function alterResponse(FilterResponseEvent $event) {
if ($event->getResponse()->getStatusCode() == 403) {
/** @var \Symfony\Component\HttpFoundation\Request $request */
$request = $event->getRequest();
$node = $request->attributes->get('node');
if ($node instanceof Node && !$node->isPublished()) {
$response = $event->getResponse();
// This changes the code, but doesn't return a 404 page.
$response->setStatusCode(404);
$event->setResponse($response);
}
}
}
}
Finalmente recurrí a eliminar este suscriptor de respuesta por completo y usé hook_node_access de esta manera:
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Drupal\Core\Access\AccessResult;
function unpublished_404_node_access(\Drupal\node\NodeInterface $node, $op, \Drupal\Core\Session\AccountInterface $account) {
if ($op == 'view' && !$node->isPublished()) {
if (\Drupal::moduleHandler()->moduleExists('workbench_moderation') && $account->hasPermission('view any unpublished content')) {
return AccessResult::neutral();
}
elseif (\Drupal::routeMatch()->getRouteName() == 'entity.node.canonical' && \Drupal::routeMatch()->getRawParameter('node') == $node->id()) {
throw new NotFoundHttpException();
return AccessResult::neutral();
}
}
return AccessResult::neutral();
}
Esto parece estar en línea con varias respuestas en este sitio para Drupal 7. Pero quería ver si alguien tiene una mejor manera de hacerlo, ya sea con un suscriptor de KernelEvent, en lugar de hook_node_access. Parece que lo que quiero hacer es probar si un nodo está devolviendo un 403 y luego generar una nueva respuesta con la página 404 y el código de estado 404. No estoy seguro de cómo hacer eso.