FOSRestBundle的多个根路由

时间:2017-07-17 00:45:43

标签: rest api symfony routing fosrestbundle

我正在使用FOSRestBundle,我找不到如何拥有两个不同的端点,一个用于模板渲染(例如html / twig,/app),另一个用于序列化(json,{ {1}}例如)。可能吗 ? FOSRestBundle Automatic Route generation的文档并未指出任何此类文档。

使用Symfony 3和FOSRestBundle 2.x

2 个答案:

答案 0 :(得分:2)

您可以通过app / config.yml中的格式侦听器进行配置。

fos_rest:
  format_listener:
    rules:
        - { path: '^/api', priorities: [json], fallback_format: json, prefer_extension: false }
        - { path: '^/', priorities: ['text/html', '*/*'], fallback_format: html, prefer_extension: false }
  param_fetcher_listener: force
  view:
    view_response_listener: force
    formats:
        json: true
        html: true

关于路由部分,这是一个具有两个动作的控制器的示例,每个动作对应一种响应(注释):

namespace RVW\AppBundle\Controller;

use FOS\RestBundle\Controller\Annotations\Route;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class BrandController extends FOSRestController
{
  /**
   * @param Request $request
   * @View(statusCode=Response::HTTP_OK)
   * @Route("/brands", name="brands")
   * @Method({"GET"})
   *
   * @return View
   */
  public function brandsAction(Request $request): View
  {
    return $this->container->get('doctrine')->getRepository('AppBundle:Brand')->findAll();
  }

  /**
   * @Route("/", name="index")
   *
   * @return Response
   */
  public function indexAction(Request $request): Response
  {
    return $this->render('@App/index.html.twig', [
        'data' => $data,
    ]);
  }
}

干杯,

答案 1 :(得分:0)

只需在路由配置中指定prefix

如果您使用的是YAML,则可以更改routing.yml文件:

app:
    resource: '@AppBundle/Controller/'
    type:      annotation
    prefix:    /app

api:
    type:     rest
    resource: AppBundle\Controller\RestController
    prefix:   /api

现在您的正常路线以/app开头,您的REST路线以/api

开头