跳转至

路由和渲染

将控制器动作的匹配请求基于约定而不是广泛的配置来执行。

我们有 4 个示例路由器在我们的 核心 中。 他们的配置和使用与 Symfony 的路由器执行实际路由,因此可以期待相同的高性能。

在将请求路由到适当的控制器操作后,路由器随后呈现响应以简化控制器测试:

Symlex\Router\Web\RestRouter 处理 REST 请求(JSON)

Symlex\Router\Web\ErrorRouter 将异常呈现为错误消息( HTML 或 JSON )

Symlex\Router\Web\TwigRouter 通过 Twig 呈现常规网页 (HTML)

Symlex\Router\Web\TwigDefaultRouter 就像 TwigRouter ,但将所有请求发送到默认控制器操作(客户端路由需要,例如使用 Vue.js )

控制器动作不应直接返回 JSON 或 HTML ,但它们可以返回 Symfony Request 对象,例如 返回二进制数据或实现特殊用例

默认路由

下面,您将根据我们的默认配置找到一些示例 App\Kernel\WebApp:

<?php

// 错误路由器捕获错误并将其显示为错误页面
$container->get('router.error')->route();

// REST API调用的路由
$container->get('router.rest')
    ->route($this->getUrlPrefix('/api/v1'), 'controller.rest.v1.');

// 所有其他请求都路由到默认控制器操作
$container->get('router.twig_default')
    ->route($this->getUrlPrefix(), 'controller.web.index', 'index');

// 取消注释以下行以启用服务器端路由
// $container->get('router.twig')
//    ->route($this->getUrlPrefix(), 'controller.web.');

所有请求(除了那些以 /api/v1)将被路由到 controller.web.index 服务的 indexAction(Request $request)

GET /api/v1/users 将被路由到 controller.rest.v1.users 服务的 cgetAction(Request $request)

POST /api/v1/users 将被路由到 controller.rest.v1.users 服务的 postAction(Request $request)

OPTIONS /api/v1/users 将被路由到 controller.rest.v1.users 服务的 coptionsAction(Request $request)

GET /api/v1/users/123 将被路由到 controller.rest.v1.users 服务的 getAction($id, Request $request)

OPTIONS /api/v1/users/123 将被路由到 controller.rest.v1.users 服务的 optionsAction($id, Request $request)

GET /api/v1/users/123/comments 将被路由到 controller.rest.v1.users 服务的 cgetCommentsAction($id, Request $request)

GET /api/v1/users/123/comments/5 将被路由到 controller.rest.v1.users 服务的 getCommentsAction($id, $commendId, Request $request)

PUT /api/v1/users/123/comments/5 将被路由到 controller.rest.v1.users 服务的 putCommentsAction($id, $commendId, Request $request)

如果你取消注释 router.twig 而替换 router.twig_default, 所有的请求 (除了那些以 /api/v1 开头的) 将被路由到匹配 Web 控制器操作 e.g.:

GET / 将被路由到 controller.web.index 服务的 indexAction(Request $request)

GET /foo 将被路由到 controller.web.foo 服务的 indexAction(Request $request)

GET /foo/bar 将被路由到 controller.web.foo 服务的 barAction(Request $request)

POST /foo/bar 将被路由到 controller.web.foo 服务的 postBarAction(Request $request)

开发

根据我们的示例,可以轻松创建自己的自定义路由。

在这种情况下,您应该使用自定义内核作为应用程序的 HTTP 内核 负责初始化路由器和设置可选的 URL / service name prefixes。