Создание ссылки из идентификатора узла в Drupal 8

Я проверяю Drupal 8 и пытаюсь создать ссылку на основе идентификатора узла статьи. В Drupal 7 это что-то вроде:

$options = array('absolute' => TRUE);
$nid = 1; // Node ID
$url = url('node/' . $nid, $options);

это приводит к абсолютной ссылке с правильным url-псевдонимом.

таким образом, функция url()-кажется устаревшей; каков путь Drupal-8? Выглядит как действительно базовая функция для меня, но я не смог найти никаких полезных ссылок.

5 ответов


вам нужно использовать \Drupal\Core\Url класс, в частности его fromRoute статический метод. Drupal 8 использует маршруты, имена которых отличаются от их фактического URL-пути. В вашем случае используемый маршрут является каноническим маршрутом для объекта узла:entity.node.canonical. \Drupal\Core\Url::fromRoute() возвращает не строку,а объект. Чтобы получить URL в виде строки, вам нужно вызвать его toString() метод.

$options = ['absolute' => TRUE];
$url = \Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

статический метод нелегко проверить,$url->toString() требуется инициализированный контейнер. Вы можете заменить статический метод вызовом UrlGeneratorInterface::generateFromRoute() на url_generator сервис.

$options = ['absolute' => TRUE];
$url = $this->url_generator->generateFromRoute('entity.node.canonical', ['node' => 1], $options);
$url = $url->toString();

к сожалению, этот метод помечен как @internal так что вы не должны использовать его в коде пользователя (т. е. за пределами ядра Drupal).


создать абсолютный URL-адрес:

$options = ['absolute' => TRUE];
$url_object = Drupal\Core\Url::fromRoute('entity.node.canonical', ['node' => $nid], $options);
// will output http://example.com/path-to-my-node

создать объект абсолютной ссылки:

$options = ['absolute' => TRUE, 'attributes' => ['class' => 'this-class']];
$node_title = Drupal\Core\Render\Markup::create('<span>' . $node_title . '</span>');
$link_object = Drupal\Core\Link::createFromRoute($node_title, 'entity.node.canonical', ['node' => $nid], $options);
// will output <a href="http://example.com/path-to-my-node" class="this-class"><span>My Node's Title</span></a>

Если у вас есть полностью загруженный объект узла, вы можете просто вызвать $node->toUrl() чтобы получить требуемый URL. По умолчанию он возвращает канонический URL для узла (node / NID), но можно создать другие URL-адреса, перечисленные в определении сущности узла (см. Drupal\node\Entity\Node.в PHP). То же самое верно для других типов сущностей.

$options = ['absolute' => TRUE];
$view_link = Link::fromTextAndUrl(t('View'), $node->toUrl('canonical', $options));
$edit_link = Link::fromTextAndUrl(t('Edit'), $node->toUrl('edit-form', $options));
$delete_link = Link::fromTextAndUrl(t('Delete'), $node->toUrl('delete-form', $options));

хе-хе, это дерьмо с точки зрения получения URL из поля (версия Twig получения этого URL)

Если вы хотите URL (и заголовок), который находится в поле, вы должны добраться до объекта класса: Drupal\Core\Url

Если вы получили узел по drupal_entity (Twig Tweaks) тогда у вас есть: (я буду использовать "tab" в качестве этого узла) tab['#node'].field_link

Это дает вам использование:

tab['#node'].field_link.Ури - > Ури (URI не является URL)

tab['#node'].field_link.название -> название

но, это еще не конец.

лучше acess Drupal\link\Plugin\Field\FieldType\LinkItem by:

tab['#node'].field_link.get (0)

tab['#node'].field_link[0]

(оба делают то же самое)

затем вы можете получить доступ к тому, что самое интересное:

tab['#node'].field_tab_link[0].getUrl () a Drupal\Core\Url


вам нужно использовать Drupal\Core\Url; класса.

$url= Url::fromRoute('root', $route_parameters=array());

$link = \Drupal::l(t('label'), $url);  

пример:

если вы передаете аргумент

$url = Url::fromRoute('test.page', $route_parameters = array('test' => 1));

иначе

$url = Url::fromRoute('test.page');
$link = \Drupal::l(t('Label'), $url);