Symfony2 + FOSRestBundle + FrameworkExtraBundle使用@Template时禁用休息和错误

时间:2016-03-04 21:35:46

标签: fosrestbundle symfony

我正在尝试设置我的应用程序,因此相同的操作可以返回web和api的响应。这很有效,但有时只需要网站而不是api。我正在寻找一种方法来为每个动作/控制器启用/禁用此功能。

我已经创建了两个可以测试的演示操作,但是无法在api url上做出一个响应。

可通过domain.com访问网站

可通过api.domain.com访问Api - 所有对api的请求都使用config中的格式侦听器格式化为json

- { path: '^/', host: 'api.domain.dev', priorities: ['json'], fallback_format: ~, prefer_extension: false }

第一个操作(indexAction)可以正常返回HTML和Json,具体取决于您使用的域。问题在于第二个操作(testAction),我希望这只适用于网站域。访问api.domain.com/company-test时,响应是模板HTML,其content-type标头设置为application / json。

当JSON版本不可用且正在使用@Template时,有没有办法让这个返回错误(404?)?

测试操作

use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Nelmio\ApiDocBundle\Annotation\ApiDoc;

/**
 * Get a list of companies
 *
 * @Rest\Get("/company")
 * @Rest\View(
 *     template = "CompanyBundle:Company:index.html.twig",
 *     templateVar = "companies",
 *     statusCode = 200,
 * )
 *
 * @ApiDoc(
 *     description=""
 * )
 */
public function indexAction() {
    $em = $this->getDoctrine()->getManager();

    $companies = $em->getRepository('CompanyBundle:Company')->findAll();

    $view = View::create();

    $view->setData($companies);
    $view->setTemplateData(['extraData' => 'Hello World!']);
    return $view;
}


/**
 * Get a list of companies
 *
 * @Route("/company-test")
 *
 * @ApiDoc(
 *     description=""
 * )
 *
 * @Template(
 *     template="CompanyBundle:Company:index.html.twig"
 * )
 */
public function testAction() {
    $em = $this->getDoctrine()->getManager();

    $companies = $em->getRepository('CompanyBundle:Company')->findAll();

    return [
        'companies' => $companies,
        'test-test' => 'Hello World!'
    ];
}

1 个答案:

答案 0 :(得分:0)

我认为您可以从SensioFrameworkExtraBundle扩展TemplateListener并修改“onKernelView”https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/EventListener/TemplateListener.php#L77

创建自己的侦听器作为扩展原始TemplateListener的MyBundle \ EvetListener \ MyListener.php,然后可以将整个onKernelView方法和chanage https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/EventListener/TemplateListener.php#L83转换为

    if (null === $template) {
         return;
    } elseif($this->getRequest()->getHost() == $this->container->getParameter('api_domain')) { // %api_domain% should be filled at parameters.yml    
         $event->setResponse(new JsonResponse(NULL, Response::HTTP_NOT_FOUND)); // don't forget to add "use Symfony\Component\HttpFoundation\JsonResponse"
        return;
    }

覆盖服务参数https://github.com/sensiolabs/SensioFrameworkExtraBundle/blob/master/Resources/config/view.xml#L8

as

<parameters>
        <parameter key="sensio_framework_extra.view.listener.class">MyApp\EventListener\MyListener</parameter>
 </parameters>

或通过yml,如果您使用yml而不是xml进行服务配置