2009-04-27 3 views
11

젠드 프레임 워크에서 내 커스텀 라우트의 정의를 어떻게 줄일 수 있습니까? 현재이 정의가 있습니다.젠드 프레임 워크 라우팅 정의 단축

$route = new Zend_Controller_Router_Route(
    ":module/:id", 
    array(
     "controller" => "index", 
     "action" => "index" 
    ), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutOne', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:id", 
    array("action" => "index"), 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutTwo', $route); 

$route = new Zend_Controller_Router_Route(
    ":module/:controller/:action/:id", 
    null, 
    array("id" => "\d+") 
); 
self::$frontController->getRouter()->addRoute('shortcutThree', $route); 

이 규칙을 더 잘 조합 할 수있는 방법이 있습니까? 그리고 이들을 배치하는 가장 좋은 방법은 무엇입니까? 프론트 컨트롤러를 초기화 한 직후 부트 스트랩 클래스에 있습니다.

답변

6

이렇게 경로를 설정할 때는 설정 파일을 사용합니다. 환경 설정으로 XML을 사용하여 설정 데이터를 저장하지만,이 설정은 다른 지원되는 형식으로 쉽게 저장할 수 있습니다. 그런 다음 config의 경로를 내 부트 스트랩의 라우터에 추가합니다.

구성 :

<config> 
    <routes> 
     <shortcutone type="Zend_Controller_Router_Route"> 
      <route>:module/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutone> 
     <shortcuttwo type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:id</route> 
      <defaults> 
       <controller>index</controller> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcuttwo> 
     <shortcutthree type="Zend_Controller_Router_Route"> 
      <route>:module/:controller/:action/:id</route> 
      <defaults> 
       <controller>index</controller> 
       <action>index</action> 
      </defaults> 
      <reqs id="\d+"> 
     </shortcutthree> 
    </routes> 
</config> 

부트 스트랩 물론, 거기에 다른 옵션은 내가이에 documentation을 읽어 보시기 바랍니다 것입니다, 그러나 이것은 당신을위한 맞는

$config = new Zend_Config_Xml('config.xml'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

예.

+0

감사합니다. 난 그때 내 부트 스트랩 슬림을 유지하기 위해 구성을 사용합니다 :) –

8

내 routes.ini 파일이 너무 커지기 시작했기 때문에 Zend Caching을 사용하여 구문 분석 된 후에 경로를 캐시하기로 결정했습니다. 백엔드 캐싱 솔루션을 위해 Xcache를 사용했습니다. 여기에 Bootstrap.php 파일에 넣어되어야하는 코드는 다음과 같습니다

 
protected function _initRoutes() 
{ 
    $backendType = 'Xcache'; 
    $backendOptions = array(); 

    // Instantiate a caching object for caching the routes 
    $cache = Zend_Cache::factory('File', $backendType, 
    array(
     'automatic_serialization' => true, 
     'master_files'=>array(APPLICATION_PATH . '/configs/routes.ini') 
    ), 
    $backendOptions 
); 

    $frontController = Zend_Controller_Front::getInstance();   

    if(! $router = $cache->load('router')) { 

    // Load up .ini file and put the results in the cache 
    $routes = new Zend_Config_Ini (APPLICATION_PATH . '/configs/routes.ini', 'production');    
    $router = $frontController->getRouter(); 
    $router->addConfig($routes, 'routes'); 

    $cache->save($router, 'router'); 
    }  
    else {   
    // Use cached version 
    $frontController->setRouter($router); 
    } 

} 
내가 더 젠드와 같은 훨씬 더 가벼운 무게와 컴팩트 한 이후 젠드를 사용하여 특히 XMLS 이상 * .INI 파일을 사용하는 것을 선호
+0

안녕하세요, 나는 그것 자체가 PDOConnection을 처리하는 FrontController를 처리하기 때문에 당신이 라우터 객체를 캐시 할 수 있는지 궁금하네요 ... – Trent

7

. 다음은 Zend_Config_Ini()을 사용하여 거의 비슷한 구성입니다.

application.ini 파일의 [routes] 섹션은 이름이 변경 될 수 있음을 application.ini

[routes] 
routes.shortcutone.route=:module/:id 
routes.shortcutone.defaults.controller=index 
routes.shortcutone.defaults.action=index 
routes.shortcutone.reqs=\d+ 

bootstrap.php

$config = new Zend_Config_Ini('application.ini', 'routes'); 
$router = Zend_Controller_Front::getInstance()->getRouter(); 
$router->addConfig($config, 'routes'); 

를 적어 둡니다. 이름을 바꿀 때 두 번째 매개 변수 Zend_Config_Ini()은 새 섹션 제목을 반영해야합니다.

+3

'routes.shortcutone.reqs. id = \ d +'? –