Пользовательский сценарий маршрутизации лития

Мне было поручено переписать существующий веб-сайт с большим ранее существующим каталогом ссылок. Для аргументации предположим, что мы не можем делать ничего, что могло бы изменить каталог ссылок. Вот несколько примеров структуры ссылок, с которыми мы работаем:

  1. Страница позиции:

    www.domain.com/widgets/some-totally-awesome-large-purple-widget 
  2. Страница вспомогательной страницы категории:

     www.domain.com/widgets/purple-widgets 
  3. Страница родительской страницы категории:

     www.domain.com/widgets/ 
  4. Пользовательская страница может быть:

     www.domain.com/some-random-page 

Различных типов страниц слишком много, чтобы писать отдельные маршрутизаторы.

Использование Router :: connect Я могу легко учитывать первый и второй сценарии, используя что-то вроде:

 Router::connect('/{:pageroot}/{:pagekey}', 'Pages::index'); 

В свою очередь, метод Pages :: index ищет записи в нашей базе данных с ключом «/ widgets / purple-widgets».

Тем не менее, фреймворк по умолчанию использует маршрут '/ {: controller} / {: action} / {: args} для таких страниц, как третий и четвертый. Я знаю, что это правильное поведение для фреймворка. Кроме того, в лучшей практике будет указано, что я должен написать сайт, чтобы соответствовать этому поведению. Но это не вариант.

Мне нужен маршрутизатор, который позволит третьему и четвертому примерам функционировать так же, как и первый. Все примеры должны быть отправлены контроллеру Pages :: index, который, в свою очередь, запрашивает базу данных с использованием URL-адреса в качестве ключа.

Solutions Collecting From Web of "Пользовательский сценарий маршрутизации лития"

Если у вас нет какого-либо соглашения в URL-адресе для чего-то, между страницей, пунктом и категорией. Я бы пошел с очень общим маршрутизатором.

 Router::connect('/{:category}/{:page}/{:item}', 'Pages::any'); Router::connect('/{:category}/{:page}', array('Pages::any', 'item' => null)); Router::connect('/{:category}', array('Pages::any', 'page' => null, 'item' => null)); 

И в Pages::any() искать правильный материал. Действительно ли эта category является page (пример 4)? Эта page является item (пример 1)?

или

Вы храните URL-адрес где-нибудь (например, таблицу сопоставления в базе данных) и используете версию pattern литиевого маршрута .

 Router::connect(new Route(array( 'pattern' => '@^/(?<path>.+)$@', 'params' => array('controller' => 'pages', 'action' => 'any'), 'keys' => array('path' => 'path'), // extra stuff, if the path is `tata`, it skips this route and uses // any of the following ones that matches. 'handler' => function($request) { if ($request->params['path'] == 'tata') { return false; } else { return $request; } } ))); 

С этого момента вы получите полный URL-адрес.

Вероятно, вам стоит написать умный помощник маршрутизатора, который, возможно, сможет обработать ваш запрос на основе ваших определенных маршрутов.

Взгляните на: net / http / Router.php

особенно connect (), parse () и match ()

Я начал бы писать какую-то анонимную функцию и продвигать ее к проверяемому классу, который находится в / extension ..?