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

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

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' 

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

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);