我想做什么,
我有一个使用ZendFramework2的PHP应用程序,它有一个“可视”端(它返回漂亮的HTML网页)和一个API端(它只是返回JSON)。当请求发送到我们的服务器时,它将通过onBootstrap( \Zend\Mvc\MvcEvent )
函数在Module.php
中路由。引导函数执行一些常规设置和检查(是用户签名的in...etc)。然后为\Zend\Mvc\Controller\AbstractRestfulController
(我们的API控制器)附加一个分派函数,为\Zend\Mvc\Controller\AbstractActionController
(“视觉”控制器)附加另一个分派函数。
在分派函数中,会检查和设置更多会话特定的内容,有时还会出现错误。如果\Zend\Mvc\Controller\AbstractActionController
的分派函数发生错误,那么它只是将错误消息返回给视图,视图将其显示给用户。如果\Zend\Mvc\Controller\AbstractRestfulController
的分派函数发生错误,我希望它返回一个带有错误信息和适当的响应头(400,404...etc)的JsonModel。
发生了什么
当\Zend\Mvc\Controller\AbstractRestfulController
的调度函数发生错误时,响应头被设置,但主体没有设置。最重要的是,操作仍然被路由到控制器,所以如果控制器指定了一个新的响应头,那么它就会覆盖上一个响应头。
下面是我代码的摘录:
public function onBootstrap( \Zend\Mvc\MvcEvent $event ) {
...
$event_manager = $event->getApplication()->getEventManager();
$shared_manager = $event_manager->getSharedManager();
...
// Dispatch event for AbstractRestfulController calls
$shared_manager->attach('Zend\Mvc\Controller\AbstractRestfulController', 'dispatch', function($event) {
...
try {
$organization = $organization_interface->get($id);
} catch(Exception $e) {
$event->getResponse()->setStatusCode($e->getCode());
return new JsonModel(array(
'error' => $e->getMessage(),
));
}
...
}, 100);
...
}
所以我知道返回的JsonModel不能工作,因为它是从调度函数而不是控制器返回的。我想知道的是一种“简单”的方法来发送我的JsonModel作为响应,并阻止框架在控制器中运行路由操作。
任何和所有的帮助都是感激的。谢谢!
发布于 2014-08-26 01:56:58
如果您正在寻找从那个JSON模型返回的字符串,那么这就足够了-
很明显,要获得调度操作,而不是JSON模型,所以请尝试以下操作-
而不是-
return new JsonModel(array(
'error' => $e->getMessage(),
));
写
$view = new JsonModel(array(
'error' => $e->getMessage(),
));
echo $view->serialize();
http_response_code($e->getCode()); //Added the line of code as per suggested in the comment by B1NARY
exit();
这将返回JSON字符串。
如果这不是你要找的,请告诉我们。
发布于 2016-01-31 03:27:25
对我来说,这是一个更好的zf2ish解决方案:
$this->response->setStatusCode(Response::STATUS_CODE_401);
$viewModel = new JsonModel(['error' => 'Unauthorized', 'error_description' => $exception->getMessage()]);
$event->setViewModel($viewModel);
$event->stopPropagation(true);
return $viewModel;
https://stackoverflow.com/questions/25494899
复制