我正在写使用Zend Framework 1.12 REST API。 我要检查在控制器插件“授权”头。
我把代码在插件的preDispatch行动
$authorizationHeader = $request->getHeader('Authorization');
if(empty($authorizationHeader)) {
$this->getResponse()->setHttpResponseCode(400);
$this->getResponse()->setBody('Hello');
die(); //It doesn't work
}
问题是,后控制器的动作仍在调用。 我想“死()”,“退出”。 我的问题是怎么回事,从插件的反应和不调用控制器的动作。
做与Zend类似的REST API几个星期前使用这种方法:
类瓦尔/ Consts:
protected $_hasError = false;
const HEADER_APIKEY = 'Authorization';
我preDispatch:
public function preDispatch()
{
$this->_apiKey = ($this->getRequest()->getHeader(self::HEADER_APIKEY) ? $this->getRequest()->getHeader(self::HEADER_APIKEY) : null);
if (empty($this->_apiKey)) {
return $this->setError(sprintf('Authentication required!'), 401);
}
[...]
}
我的自定义功能SETERROR:
private function setError($msg, $code) {
$this->getResponse()->setHttpResponseCode($code);
$this->view->error = array('code' => $code, 'message' => $msg);
$this->_hasError = true;
return false;
}
然后,只需检查是否有错误已设置你的函数中:
public function yourAction()
{
if(!$this->_hasError) {
//do stuff
}
}
如果您使用ContextSwitch里和JSON,然后用你的错误阵列将自动返回和显示,如果有错误occours:
public function init()
{
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$this->_helper->contextSwitch()->initContext('json');
[...]
}
希望这可以帮助
由于检查头通常是一个低级别的请求操作,你可以做头部验证,然后抛出一个异常,如果没有有效的插件dispatchLoopStartup。 然后在您的差错控制,返回相应的反应。 这将阻止派出/运行的操作,没有修改任何控制器代码可以被应用到任何控制器/行动。
控制器插件:
class AuthHeader extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(\Zend_Controller_Request_Abstract $request)
{
// Validate the header.
$authorizationHeader = $request->getHeader('Authorization');
if ($invalid) {
throw new Zend_Exception($error_message, $error_code);
}
}
}
错误处理:
class ErrorController extends Zend_Controller_Action
{
public function init()
{
// Enable JSON output for API originating errors.
if ($this->isApiRequest($this->getRequest())) {
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$contextSwitch->addActionContext('error', 'json')
->setAutoJsonSerialization(true)
->initContext('json');
}
}
public function errorAction()
{
// Handle authorization header errors
// ...
// Handle errors
// ...
}
public function isApiRequest($request)
{
// Determine if request is an API request.
// ...
}
}