Saya mencoba mengembalikan halaman 404 alih-alih 403 respons untuk node yang tidak dipublikasikan di Drupal 8.
Saya menguji pelanggan respons kernel , tetapi menemukan kode yang saya gunakan hanya akan mengubah kode status menjadi 404 dari 403, tidak benar-benar menampilkan halaman 404. Jadi, mungkin seseorang dapat menunjukkan kepada saya cara membuat objek Respons 404 halaman di sana?
Ini adalah kode yang saya gunakan:
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);
}
}
}
}
Saya akhirnya terpaksa menghapus pelanggan respons ini sepenuhnya dan menggunakan hook_node_access seperti ini:
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();
}
Ini tampaknya sejalan dengan beberapa jawaban di situs ini untuk Drupal 7. Tapi saya ingin melihat apakah ada yang punya cara yang lebih baik untuk melakukan ini baik dengan pelanggan KernelEvent, daripada hook_node_access. Sepertinya yang ingin saya lakukan adalah menguji apakah sebuah node mengembalikan 403 dan kemudian menghasilkan respons baru dengan halaman 404 dan kode status 404. Saya tidak yakin bagaimana melakukan itu.