[英]Symfony: How to return a JSON response from a Before Filter (Listener)?
通過遵循此示例,我成功設置了以下偵聽器/之前過濾器,以在處理任何控制器動作之前解析對我的API端點(即/ api / v1)的所有請求。 這用於驗證請求類型,如果不滿足某些條件,則引發錯誤。
我想根據應用程序環境狀態區分錯誤響應。 如果我們正在開發或測試中,我只是想拋出遇到的錯誤。 另外,如果在生產模式下,我想將錯誤作為JSON響應返回。 這可能嗎? 如果沒有,我該怎么做類似的事情?
我正在使用Symfony v3.1。*,如果有什么不同的話。
namespace AppBundle\EventListener;
use AppBundle\Interfaces\ApiAuthenticatedController;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class ApiBeforeListener
{
/**
* @var \Symfony\Component\DependencyInjection\ContainerInterface
*/
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
/**
* Validates a request for API resources before serving content
*
* @param \Symfony\Component\HttpKernel\Event\FilterControllerEvent $event
* @return mixed
*/
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
if (!is_array($controller))
return;
if ($controller[0] instanceof ApiAuthenticatedController) {
$headers = $event->getRequest()->headers->all();
// only accept ajax requests
if(!isset($headers['x-requested-with'][0]) || strtolower($headers['x-requested-with'][0]) != 'xmlhttprequest') {
$error = new AccessDeniedHttpException('Unsupported request type.');
if (in_array($this->container->getParameter("kernel.environment"), ['dev', 'test'], true)) {
throw $error;
} else {
// return json response here for production environment
//
// For example:
//
// header('Content-Type: application/json');
//
// return json_encode([
// 'code' => $error->getCode(),
// 'status' => 'error',
// 'message' => $error->getMessage()
// ]);
}
}
}
}
}
與大多數事件不同,FilterControllerEvent不允許您返回響應對象。 很好,但是很好。
您有兩個基本選擇。
最好的方法是簡單地引發一個異常,然后添加一個異常偵聽器。 然后,異常偵聽器可以根據環境返回JsonResponse。
創建僅返回JsonResponse的控制器的另一種可能性,然后使用$ event-> setController($ jsonErrorController)指向它。
但是我認為拋出異常可能是您最好的選擇。
此處有更多詳細信息: http : //symfony.com/doc/current/reference/events.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.