投稿者this example私は、コントローラアクションが処理される前に、APIエンドポイント(つまり/ api/v1)へのすべてのリクエストを解析するために、以下のListener/Before Filterを設定することができました。これは、要求タイプを検証し、特定の条件が満たされない場合にエラーをスローするために使用されます。Symfony:Before Filter(Listener)からJSONレスポンスを返す方法は?
私はアプリケーションの環境状態に基づいてエラー応答を区別したいと思います。私たちが開発やテストをしている場合は、遭遇したエラーを投げたいだけです。また、プロダクションモードで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()
// ]);
}
}
}
}
}
@Caredあなたの最初の提案は良いアイデアのように聞こえます。私はそれに行くと報告を返すよ。 –