Есть ли многоразовый маршрутизатор / диспетчер для PHP? - PullRequest
6 голосов
/ 18 марта 2011

Я использую простую инфраструктуру, которая обрабатывает запросы на основе параметров запроса.

http://example.com/index.php?event=listPage
http://example.com/index.php?event=itemView&id=1234

Я хочу поместить чистые URL перед этим, чтобы вы могли получить к нему доступ таким образом:

http://example.com/list
http://example.com/items/1234

Я знаю, как работают маршруты и диспетчеризация, и я мог бы написать это сам. Но я бы предпочел воспользоваться всем кодом, который уже решает эту проблему. Кто-нибудь знает универсальную библиотеку или класс, который предоставляет эту функциональность, но позволит мне вернуть все, что я хочу из совпадения маршрута ? Как то так.

$Router = new Router();
$Router->addRoute('/items/:id', 'itemView', array( 'eventName' => 'itemView' ));

$Router->resolve( '/items/1234' );
// returns array( 'routeName' => 'itemView',
//                'eventName' => 'itemView,
//                'params' => array( 'id' => '1234' ) )

По сути, я мог бы выполнять диспетчеризацию самостоятельно, основываясь на значениях, разрешенных по пути. Я не возражаю против удаления этого из фреймворка, если это не слишком много проблем (и до тех пор, пока позволяет лицензия). Но обычно я нахожу, что маршрутизация / диспетчеризация в фреймворках слишком слаба для такой перепрофилирования. И мои поиски, кажется, показывают, что люди пишут это сами, если они не используют фреймворки.

Хорошее решение будет поддерживать следующее:

  • указать маршруты с двоеточием или регулярным выражением
  • разбирает параметры вне маршрутов и как-то возвращает их
  • Поддержка быстрого обратного просмотра выглядит так:

    $Router->get( 'itemView', array( 'id' => '1234' ) );
    // returns 'items/1234'
    

Любая помощь приветствуется.

1 Ответ

8 голосов
/ 18 марта 2011

GluePHP может быть очень близко к тому, что вы хотите. Он предоставляет одну простую услугу: сопоставлять URL-адреса с классами.

require_once('glue.php');

$urls = array(
    '/' => 'index',
    '/(?P<number>\d+)' => 'index'
);

class index {
    function GET($matches) {
        if (array_key_exists('number', $matches)) {
            echo "The magic number is: " . $matches['number'];
        } else {
            echo "You did not enter a number.";
        }
    }
}

glue::stick($urls);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...