微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于根据 URL 获取内容类型的 API

如何解决用于根据 URL 获取内容类型的 API

我有一个场景,我需要对未找到的 url 执行一些重定向

http://localhost/drupal9/node/1/search

单词搜索是通过我使用的插件添加的,它是前端路由而不是后端,因此在刷新此 url 后,我得到 Not Found 这完全有道理我需要做什么从 URL 中删除单词搜索重定向到,

http://localhost/drupal9/node/1/

因为搜索一个常用词,可以在其他内容类型中使用,所以我首先需要检查 URL 是否属于我的自定义内容类型。让我向您展示我已经拥有的一个实现。

function [module]_preprocess_page(&$variables) {
  $query = \Drupal::entityQuery('node')
  ->condition('type',[module]);
$nids = $query->execute();
if(array_search(2,$nids)){
echo "yes";
}
}

所以在这里我正在做的是抓取所有具有我的内容类型的节点并从 URI 抓取 Nid 并匹配它们,这确实有效,但还有另一个问题。 在页面属性中,我们有一个 ALias 选项,因此如果用户使用自定义别名,那么我不会再在 URI 中获取 Nid,因此此逻辑会中断, >

这个问题可能看起来有点棘手,但要求很简单。我正在寻找一个统一的解决方案来将 URL 解析为一些 drupal API 并简单地取回内容类型名称。Url 可能包含自定义别名或 Nid

解决方法

您可以创建一个订阅事件 EventSubscriberkernel.request 来处理 URL <node URL>/search 的情况。

有关创建 EventSubscriber 的详细步骤,您可以查看 here

以下是您需要在 EventSubscriber 类中添加的内容:

RequestSubscriber.php

<?php

namespace Drupal\test\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;

/**
 * Class RequestSubscriber.
 */
class RequestSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      KernelEvents::REQUEST => 'onKernelRequest',];
  }

  public function onKernelRequest($event) {
    $uri = $event->getRequest()->getRequestUri();  // get URI
    if (preg_match('/(.*)\/search$/',$uri,$matches)) {  // check if URI has form '<something>/search'
      $alias = $matches[1];
      $path = \Drupal::service('path_alias.manager')->getPathByAlias($alias);  // try to get URL from alias '<something>'
      if (preg_match('/node\/(\d+)/',$path,$matches)) {  // if it is a node URL
        $node = \Drupal\node\Entity\Node::load($matches[1]);
        $content_type = $node->getType();
        //... some logic you need
      }
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。