2012-03-23 4 views
3

Regex를 사용하여 내 경로를 만들었습니다. 내 경로에 사용자가 지정한 경우가 아니면 URL 도우미에 표시하지 않으려는 몇 가지 선택적 매개 변수가 있습니다. 이것을 어떻게 할 수 있습니까? Zend_Controller_Router_Route_Regex 역방향 옵션 매개 변수

내가 현재

 $route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/' 
    ); 

    $router->addRoute('color_widgets', $route); 

내가 다음 코드를

 echo $this->url(array('page' => $page), 'color_widgets', false); 

이/블루 위젯 결과 /과 URL로 페이지를 전송하지 않습니다를 다음과 URL 도우미를 호출 무슨이다 . 내가

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d' 
    ); 

그러나이 내 문제가 해결되지 않는 라우터의 역을 변경하여이 문제를 해결할 수 있습니다 나는 URL

/블루 위젯/페이지/1/제한/10 한계 아무튼이 있다고 이 사용자가 /블루 위젯에서이다와 'T는 다시 나는 다음과 같은

$route = new Zend_Controller_Router_Route_Regex(
     '([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
     array(
      'controller' => 'widget', 
      'action'  => 'list', 
      'page'  => 1, 
      'limit'  => 10 
     ), 
     array(
      1 => 'color', 
      2 => 'page', 
      3 => 'limit' 

     ), 
     '%s-Widgets/page/%d/limit/%d' 
    ); 

문제와 그 문제를 해결할 수 있습니다 보여/나는 다음 코드 블루 위젯의 다음 페이지로 먹고 싶어

 echo $this->url(array('page' => $page), 'color_widgets', false); 

그들은 실제로 /블루 위젯/페이지/2/한계로 이동합니다/10

실제로 에게 먹고 싶어/블루 위젯/페이지/2

어떻게 젠드 프레임 워크로이 작업을 수행합니다.

답변

2

가변 개수의 값을 가진 정규식 역방향 경로를 사용할 수 없습니다. 당신은 할 수 :

$route = new Zend_Controller_Router_Route(
    'widgets/:color/*', 
    array(
     'controller' => 'widget', 
     'action'  => 'list', 
     'page'  => 1, 
     'limit'  => 10 
    ), 
    array(
     'color' => '[a-zA-Z-_0-9-]+', 
     'page' => '\d+', 
     'limit' => '\d+', 
    ) 
); 
:

  1. 은 예를 들어 귀하의 경로를 변경 (권장하지 않음) 모든 선택적 매개 변수
  2. 를 사용하여 다른 경로 구조

당신은 수에 대해 다른 경로를 쓰기

또 다른 옵션은 올바른 URI를 구문 분석하고 작성할 수있는 사용자 지정 라우트 클래스를 만드는 것입니다.

+0

감사합니다. 맞춤 경로를 작성하지 않아도되었습니다. Router_Route를 사용해 보겠습니다. – user1287238

0

잘못된 Regex 일치 변수 인덱스를 제공했기 때문에 이상한 결과가 나타납니다. 코드는 다음과 같아야합니다.

$route = new Zend_Controller_Router_Route_Regex(
'([a-zA-Z-_0-9-]+)-Widgets(?:/page/(\d+))?(?:/limit/(\d+))', 
array(
    'controller' => 'widget', 
    'action'  => 'list', 
), 
array(
    1 => 'color', 
    3 => 'page', 
    5 => 'limit' 
), 
'%s-Widgets/' 
); 

$router->addRoute('color_widgets', $route);