我正在尝试设置我的应用程序,因此相同的操作可以返回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!'
];
}
答案 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进行服务配置