Пользовательский сценарий маршрутизации лития - PullRequest
3 голосов
/ 03 января 2012

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

  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-путь в качестве ключа.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Если в 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 a 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.

1 голос
/ 04 января 2012

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

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

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

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

...