我正在使用Zend Framework 1.12编写REST api。我想在控制器插件中检查“Authorization”标题。
我将代码放在插件的preDispatch操作中
$authorizationHeader = $request->getHeader('Authorization');
if(empty($authorizationHeader)) {
$this->getResponse()->setHttpResponseCode(400);
$this->getResponse()->setBody('Hello');
die(); //It doesn't work
}
问题在于控制器的操作仍然被调用。我试过'die()','退出'。我的问题是如何从插件返回响应,而不是调用控制器的动作。
答案 0 :(得分:1)
几周前,Zend使用这种方法做了类似的REST API:
Class Vars / 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,则会自动返回包含错误的数组&如果出现错误,则显示:
public function init()
{
$contextSwitch = $this->_helper->getHelper('contextSwitch');
$this->_helper->contextSwitch()->initContext('json');
[...]
}
希望这有帮助
答案 1 :(得分:1)
由于检查标头通常是低级请求操作,因此您可以执行标头验证,如果在插件的dispatchLoopStartup中无效则抛出异常。然后在错误控制器中,返回相应的响应。这将阻止调度/运行操作,并且可以应用于任何控制器/操作而无需修改任何控制器代码。
Controller插件:
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.
// ...
}
}