2016-11-23 4 views
2

Я хотел бы уменьшить количество повторяющихся кодов и дать канонический URL-адрес в моем приложении Drupal 8. Поскольку система маршрутизации построена на Symfony, я включил ее в заголовок.Возможно ли построить путь Symfony, используя только параметры?

Я создаю пути по маршрутам в файле mymodule.routing.yml. Я хочу совместить указанное число различных строк в первом аргументе и slug, который может быть любой строкой во втором аргументе. Это выглядит следующим образом:

entity.my_entity.canonical: 
    path: '/{type}/{slug}' 
    defaults: 
    _controller: '\namespace\PostController::show' 
    requirements: 
    _permission: 'perm' 
    type: different|strings|that|can|match| 

Теперь, когда я пытаюсь получить доступ, используя, например /match/some-slug тогда он просто говорит: «Страница не найдена». Если я что-то статично в пути, например path: '/j/{type}/{slug}', то он работает как ожидается, когда я открою /j/match/some-slug в браузере.

Мой босс не любит лишних символов в URL-адресе, поэтому я хотел бы достичь этого, используя два параметра, как показано в первом примере.

+0

Убедитесь, что нет другого пути, который мог бы иметь конфликт с ним, потому что это можно прекрасно. – yceruto

+0

Как я мог узнать? Будет ли он рассматриваться как конфликт, если другой путь имеет два параметра, или только если параметры имеют одно и то же имя? – littlethoughts

+2

Используйте 'php bin/console debug: router' для отладки ваших определенных маршрутов и также проверите заказ – yceruto

ответ

1

Как упоминал Йонел в комментариях, вы можете использовать debug: router для проверки всех ваших маршрутов. Я не вижу ничего плохого в вашем коде.

Попробуйте запустить bin/console router:match "/match/blaaa", и если вы увидите какой-то контроллер, который не тот, который вам нужен, вам нужно будет изменить маршрут. Это не должно быть дела, хотя, потому что вы получаете 404.

Вот моя точная настройка, которая работает

routing.yml:

entity.my_entity.canonical: 
    path: '/{type}/{slug}' 
    defaults: 
    _controller: 'MyBundle:Something:foo' 
    requirements: 
    type: different|strings|that|can|match| 

Внутри MyBundle \ SomethingController:

public function fooAction($id) 
{ 
    return new Response("bar"); 
} 

Затем, переходя к http://localhost/match/fom, отображается ответ «бар».

+1

Спасибо за вашу помощь. Я узнал, что это невозможно в Drupal 8. И для других людей Drupal: команда для получения списка маршрутов (с Drupal Console) является 'drupal router: debug' – littlethoughts

0

Я прочитал документацию еще раз (RTM) и выяснил, что это невозможно в Drupal 8, хотя это возможно в Symfony.

Обратите внимание, что первый элемент пути не должен быть динамическим.

Источник: Structure of routes in Drupal 8

 Смежные вопросы

  • Нет связанных вопросов^_^