Мне было поручено переписать существующий веб-сайт с большим ранее существующим каталогом ссылок. Для аргументации предположим, что мы не можем делать ничего, что могло бы изменить каталог ссылок. Вот несколько примеров структуры ссылок, с которыми мы работаем:
Страница позиции:
www.domain.com/widgets/some-totally-awesome-large-purple-widget
Страница вспомогательной страницы категории:
www.domain.com/widgets/purple-widgets
Страница родительской страницы категории:
www.domain.com/widgets/
Пользовательская страница может быть:
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-адреса в качестве ключа.
Если у вас нет какого-либо соглашения в 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 ..?