2010-04-09 104 views
1

我有一個網站,我想用兩個模塊。默認& api。該網站運行的默認和工作正常(http://localhost)。但我試圖使用這樣的模塊(http://localhost/api/other-params)。但它仍然加載網站。兩條路線我都設置這樣的:Zend Framework使用模塊

 'apiDivisionStandings' => array(
      'type' => 'Zend_Controller_Router_Route', 
      'route' => 'api/division/standings/:userID', 
      'defaults' => array(
       'module'  => 'api', 
       'controller' => 'division', 
       'action'  => 'standings' 
      ) 
     ), 

    'defaultSchoolSize' => array(
      'type' => 'Zend_Controller_Router_Route', 
      'route' => ':state/:size/schools', 
      'defaults' => array(
       'module'  => 'default', 
       'controller' => 'school', 
       'action'  => 'size' 
      ) 
     ), 

在我的引導文件:

Zend_Date::setOptions(array('format_type' => 'php')); 
    Zend_Layout::startMvc(array('layout' => 'website/default' , 'layoutPath' => APPLICATION_PATH . '/default/layouts' , 'contentKey' => 'content')); 

    $routes = new Zend_Config(Routes::getRoutes()); 
    $router = new Zend_Controller_Router_Rewrite(); 
    $router->addConfig($routes, 'routes'); 

    $this->bootstrap('frontController'); 
    $frontController = Zend_Controller_Front::getInstance(); 
    $frontController->setRouter($router); 

    $cOpts = array('lifetime' => 99000 ,'automatic_serialization' => true); 
    Zend_Registry::set('cache', Zend_Cache::factory('Core', 'File', $cOpts, array('cache_dir' => '../cache/'))); 

在我的index.php之前,我引導() - >運行();

require_once '../library/Zend/Loader/Autoloader.php'; 
$loader = Zend_Loader_Autoloader::getInstance(); 
$loader->setFallbackAutoloader(true); 
$loader->suppressNotFoundWarnings(false); 
$loader->registerNamespace('Api_'); 

我的application.ini:

[production] 
phpSettings.display_startup_errors = 0 
phpSettings.display_errors = 0 
includePaths.library = APPLICATION_PATH "/../library" 
bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 
bootstrap.class = "Bootstrap" 
resources.frontController.controllerDirectory = APPLICATION_PATH "/modules/default/controllers" 
resources.frontController.moduleDirectory = APPLICATION_PATH "/modules" 

最後,我在應用程序/模塊/ API /控制器文件夾DivisionController(該網站的東西是在應用程序/模塊/默認的一部分;工作正常):

class Api_DivisionController extends Zend_Rest_Controller 
{ 

/** 
* - Class setup 
*  - Tells framework not to render to view 
*  - sets default data type to JSON 
*/ 
public function init() 
{ 
    $this->_helper->viewRenderer->setNoRender(true); 

    $this->_helper->contextSwitch() 
      ->addActionContext('standings', array('xml','json')) 
      ->addActionContext('news', array('xml', 'json')) 
      ->setAutoJsonSerialization(true) 
      ->initContext(); 
} 

但不是在頁面上獲取JSON響應我得到的網頁加載錯誤消息,它無法找到視圖。我錯過了什麼?

回答

2

ZF以相反的順序匹配路由,所以我猜想它是匹配http://localhost/api/params到您的默認路由,因爲它首先檢查它,而路由器無法知道'api'不是有效狀態。因此,請嘗試切換路線的順序,以使API是最後一個(因此首先被檢查)。

如果這不起作用,請嘗試暫時刪除默認路由並查看API請求是否可行。如果他們不這樣做,那麼這將表明您的API路線本身存在問題。

+1

這工作得很好。謝謝。我在Api_DivisionController的init()中的代碼並沒有停止渲染網站,它試圖繼續加載網站。我必須在我的echo json_encode($ array)之後放置一個出口;但是爲什麼init()函數,知道它是在我的方法中創建斷點時調用的,並沒有阻止ZF嘗試渲染頁面而不是返回json響應。謝謝! – Nathan 2010-04-10 03:20:13

+0

contextSwitch助手將特別啓用帶有json.phtml擴展名的模板,因此它可能會覆蓋setNoRender調用。聽起來你正在做的工作正常,但如果你想改變這一點,你可以將setNoRender調用移動到contextSwitch之後,然後在你的動作中做這樣的事情:$ this-> getResponse() - > setBody ($ yourJsonStuff);而不是:echo $ yourJsonStuff;出口; – 2010-04-10 18:11:49

+0

謝謝你的幫助! – Nathan 2010-04-27 22:16:12