Zend Route Regex: сопоставьте сегмент контроллера Url с чем угодно, кроме «дома» - PullRequest
1 голос
/ 06 декабря 2009

Я работаю с URL в следующем формате: «контроллер / действие», где требуется косая черта.

Мне нужно создать регулярное выражение PCRE, чтобы оно соответствовало именам контроллера и действия, если имя контроллера не имеет значения "home". Например:

  • "member / update" должен производить "member", "update"
  • «admin / index» должен выдавать «admin», «index»
  • "home / index" должен дать <nomatch>

Я играл с взглядом вперед, назад и вокруг, и у меня есть части этого, но не совсем правильное решение. Любая помощь приветствуется.

** РЕДАКТИРОВАТЬ
Вот немного больше фона. Я хочу настроить Zend маршрутизацию так, чтобы

  • URL-адрес с одной частью, отправляемый '/ foo' в HomeController, т.е. '/ home / foo'
  • любой URL с двумя частями «/ controller / action» отправляется этому контроллеру: например, «/ member / update» отправляет MemberController, «/ member / update»; '/ home / index' отправляет в HomeController и т. д.

Сейчас у меня есть маршруты, настроенные как:

$router->addRoute('homeRoute', 
    new Zend_Controller_Router_Route(
        ':action',
        array('controller' => 'home', 'action' => 'index')
    )
);
$router->addRoute('memberRoute', 
    new Zend_Controller_Router_Route(
        'member/:action',
        array('controller' => 'member', 'action' => 'index')
    )
);
// and so on, a route for each non-Home controller: adminRoute, etc

Это работает так, как я хочу, но это уродливо и проблема с обслуживанием. Я хочу заменить все маршруты 'memberRoute', 'adminRoute' и т. Д. Одним маршрутом Regex:

$router->addRoute('siteRoute',
    new Zend_Controller_Router_Route_Regex(
        '????/:action',
        array('action' => 'index'),
        array(?? => 'controller')
    )
);

Я проводил свои эксперименты с регулярными выражениями с небольшим PHP-скриптом вроде:

<?php
    preg_match('/????/', 'home/index', $output);
    echo '0=>'.$output[0].';';
    echo '1=>'.$output[1].';';
?>

Ответы [ 3 ]

0 голосов
/ 06 декабря 2009

Я не думаю, что регулярные выражения являются решением здесь. Я никогда раньше не работал с Zend Framework, но в PHP это может быть что-то вроде

$string = "controller/action";
$pieces = explode('/', $string);
if ($pieces[0] == 'home') {
  // special code here
} else {
  // other code here
}
0 голосов
/ 06 декабря 2009

Когда я слышу, "..сравнить все , но что-то", я думаю, что, возможно, это следует перевернуть: как насчет соответствия просто чему-то, или в этом случае, «домашний» контроллер?

// added last to be checked first
$router->addRoute(
  'home',
  new Zend_Controller_Router_Route(
    'home/:action',
    array('controller'  => 'home')
  )
);
0 голосов
/ 06 декабря 2009

(?:home.*)|([^/]*)(?:/(.*))?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...