API 根据 URL 获取内容类型
API to get a content type against URL
我有一个场景,我需要执行一些未找到的重定向 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 所以这个逻辑不对,
这个问题可能看起来有点棘手,但要求是 simple.I 我正在寻找一个统一的解决方案来将 URL 解析为一些 drupal API 并简单地取回内容类型name.The Url 可能包含自定义别名或 Nid
您可以创建一个 EventSubscriber
订阅事件 kernel.request
来处理 URL <node URL>/search
.
的情况
创建EventSubscriber
的详细步骤,您可以查看here。
下面是您需要在 EventSubscriber
class 中输入的内容:
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
}
}
}
}
我有一个场景,我需要执行一些未找到的重定向 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 所以这个逻辑不对,
这个问题可能看起来有点棘手,但要求是 simple.I 我正在寻找一个统一的解决方案来将 URL 解析为一些 drupal API 并简单地取回内容类型name.The Url 可能包含自定义别名或 Nid
您可以创建一个 EventSubscriber
订阅事件 kernel.request
来处理 URL <node URL>/search
.
创建EventSubscriber
的详细步骤,您可以查看here。
下面是您需要在 EventSubscriber
class 中输入的内容:
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
}
}
}
}