2012-04-17 42 views
1

我试图实现http://www.yiiframework.com/wiki/175/how-to-create-a-rest-api,并在指定的​​函数中遇到了一些问题。下面是我的功能,但首先让我解释一下这个问题。从示例实现Yii RESTful API - 生成500错误的_sendResponse函数

我有一个abstract class BaseAPIController extends Controller有​​功能。我有一个SomeObjectController extends BaseAPIController。在我的actionList功能我有行:

$this->_sendResponse(200, CJSON::encode($rows), 'application/json');

,其生成期望的输出。但是,状态码是500!

即使当我这样做:

$this->_sendResponse(200, ' ', 'application/json');

我仍然得到500状态!

但是当我做

$this->_sendResponse(200);

一切都很好,我与状态码200

这是推动我疯了预期的空响应!我需要做些什么来实现这个目标?

protected function _sendResponse($status = 200, $body = '', $content_type='text/html') 
    { 
      $status_header = 'HTTP/1.1 ' . $status . ' ' . $this->_getStatusCodeMessage($status); 

      header($status_header); 

      header('Content-Type: ' . $content_type); 

      if ($body != '') 
      { 
        echo $body; 
      } 

      else 
      { 
        $message = ''; 

        switch($status) 
        { 
          case 401: 
            $message = 'Not authorized.'; 
            break; 
          case 404: 
            $message = 'Not found.'; 
            break; 
          case 500: 
            $message = 'Internal server error.'; 
            break; 
          case 501: 
            $message = 'Method not implemented.'; 
            break; 
          default: 
            break; 
        } 

        $signature = ($_SERVER['SERVER_SIGNATURE'] == '') ? 
          $_SERVER['SERVER_SOFTWARE'] . ' Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] : 
          $_SERVER['SERVER_SIGNATURE']; 

        // Needs to be completed with templates. 

        $body = ' 
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
          "http://www.w3.org/TR/html4/strict.dtd"> 
          <html> 
          <head> 
            <meta http="Content-Type" content="text/html"; charset=iso-8859-1"> 
            <title>' . $status . ' ' . $this->_getStatusCodeMessage($status) . '</title> 
          </head> 
          <body> 
            <h1>' . $this->_getStatusCodeMessage($status) . '</h1> 
            <p>' . $message . '</p> 
            <hr /> 
          </body> 
          </html> 
          '; 
        echo $body; 
      } 

      Yii:app()->end(); 
    } 
+0

你在哪里指定了_getStatusCodeMessage的代码?在你的BaseAPIController中?您是否使用导致问题的accessFilters? – acorncom 2012-04-17 13:05:54

+0

@acorncom它是在'BaseAPIController'中指定的,是的。该基础控制器是一个抽象类。 – 2012-04-17 17:51:05

+0

我想我的问题是,如果你在_sendResponse(例如,它进入函数后立即打印出$ status),它已被更改为$ status = 500,或者是与_getStatusCodeMessage()有一些小故障? – acorncom 2012-04-17 21:46:47

回答

2

由于一些侦探通过@acorncom的启发,我看了看错误日志:

PHP Fatal error: Call to undefined function app() in /Library/WebServer/Documents/iK9/iK9/iK9/protected/modules/api/controllers/BaseAPIController.php on line 68

,当然还有,我有一个语法错误。而不是Yii::app()->end();我有Yii:app()->end()

如果有人会启发我,为什么这不会产生堆栈跟踪我想知道。

+0

很高兴听到您发现它! – acorncom 2012-04-21 19:08:17

+1

PHP在Yii中没有发现致命错误。我多次要求这样做(因为这是可行的),但核心团队有理由反对实施此类支持。 – 2012-08-07 06:25:56