Я строю объект маршрутизатора в небольшой среде MVC.Он анализирует строки URL-адресов для обнаружения контроллеров, действий и т. Д. Он настраивается.
В настоящее время пользователь может создавать маршруты, передавая строки, подобные следующим:
$this->connect('/:controller/:action/*');
$this->connect('/:controller', array('action' => 'index'));
$this->connect('/', array('controller' => 'static_pages', 'action' => 'index'));
И маршрутизатор создаетследующие регулярные выражения из них:
#^(.*)/(.*)/?.*/?$#
#^(.*)/?$#
#^/$#
Наконец, маршрутизатор пытается выбрать правильный маршрут на основе URL.URL-адреса для указанных выше маршрутов будут выглядеть примерно так:
/cars/get_colors/ # will invoke cars->get_colors();
/cars/ # will invoke cars->index();
/ # will invoke static_pages->index();
Однако
Мои регулярные выражения неверны.Первое (более конкретное) выражение может соответствовать второму условию, а второе - первому.
Если я переверну порядок для проверки в обратном порядке, маршрут статических страниц будет работать, тогда будет работать индексный маршрут контроллера, но индексная маршрутизация контроллера перехватывает все более конкретные из них!
Обновление
Я использую регулярные выражения, потому что пользователь также может подключать маршруты, подобные этим:
$this->connect('/car/:action/*', array('controller' => 'cars');
$this->connect('/crazy/url/:controller/:action/*');
Который построит два регулярных выражения, подобных этому:
#^car/(.*)/?.*/?$#
#^crazy/url/(.*)/(.*)/?.*?$#
Наконец, выполните следующую маршрутизацию:
/car/get_colors/ # will invoke cars->get_colors();
/crazy/url/cars/get_colors/ # will invoke cars->get_colors();