簡體   English   中英

Symfony:如何從Before過濾器(偵聽器)返回JSON響應?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM