Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2中的路由_Php_Routing_Symfony - Fatal编程技术网

Php Symfony2中的路由

Php Symfony2中的路由,php,routing,symfony,Php,Routing,Symfony,如何在Symfony2中设置默认路由 在Symfony1中,它看起来像这样: homepage: url: / param: { module: default, action: index } default_symfony: url: /symfony/:action/... param: { module: default } default_index: url: /:module param: { action: index } default

如何在Symfony2中设置默认路由

在Symfony1中,它看起来像这样:

homepage:
  url:   /
  param: { module: default, action: index }

default_symfony:
  url:   /symfony/:action/...
  param: { module: default }

default_index:
  url:   /:module
  param: { action: index }

default:
  url:   /:module/:action/...
以下是一个例子:

路线定义只有一个必需参数<代码>模式和三个可选参数<代码>默认值,<代码>要求和<代码>选项

以下是我自己项目的路线:

video:
    pattern:  /watch/{id}/{slug}
    defaults: { _controller: SiteBundle:Video:watch }
    requirements: { id: "\d+", slug: "[\w-]+" 

我认为使用标准路由组件是不可能的。 看看这个捆绑包,它可能会有帮助:

//Symfony2 PR10

在routing.yml中:

default:
    pattern:  /{_controller}

它允许您使用此类URL:

或者,您可以直接在控制器文件中使用@Route注释。看


至于默认路由,我认为Symfony2鼓励显式路由映射。

您可以创建自己的包来处理所有请求,并使用URL参数构造字符串以传递给控制器的转发方法。但这太糟糕了,我会选择定义良好的路由,它会让你的URL更干净,并将URL和控制器名称解耦。如果你重命名了一个捆绑包或其他东西,那么你需要重构你的URL吗?

我在查阅烹饪书寻找答案,我想我已经找到了。默认情况下,所有路由参数都有一个隐藏的要求,即它们匹配除/character([^/]+)之外的任何字符,但可以使用requirements关键字覆盖此行为,方法是强制它匹配任何字符

下面应该创建一个捕获所有其他路由的默认路由-因此,在路由配置中应该排在最后,因为下面的任何路由都不会匹配。为了确保它也与“/”匹配,包含url参数的默认值

default_route:
    pattern: /{url}
    defaults: { _controller: AcmeBundle:Default:index, url: "index" }
    requirements:
        url: ".+"

创建默认路由不是一种好的编程方式。为什么?因为这个原因,实现了异常。 Symfony2的构建就是为了以正确的方式做正确的事情

如果您想重定向所有“未找到”路由,您应该使用异常,比如NotFound404或类似的东西。你甚至可以自己定制这个页面

一条路线只有一个目的。总是。其他的想法是不好的。

如果你想创建一个“包罗万象”,你最好的办法就是钩住
KernelEvents::EXCEPTION
事件。每当异常到达
HttpKernel
时,就会触发此事件,这包括当路由器无法解析到控制器的路由时抛出的
NotFoundHttpException


其效果类似于Symfony的404样式化页面,当您通过app_dev.php发送请求时会呈现该页面。您不返回404,而是执行所需的任何逻辑。

Symfony2标准路由组件不支持它,但此捆绑包填补了Symfony1留下的空白:

它符合你的期望。您可以使用以下语法默认路由捆绑包:

FosUserBundle:
  resource: "@FosUserBundle"
  prefix:   /
  type:     default
它扫描包并自动将路由添加到路由器表中,您可以通过执行以下命令进行调试:

app/console router:debug
自动添加的默认路由示例:

[router] Current routes
Name                          Method Pattern
fos_user.user.login_check     ANY    /user/login_check.{_format}
fos_user.user.logout          ANY    /user/logout.{_format}
fos_user.user.login           ANY    /user/login.{_format}
...

您可以看到,它还通过使用文件扩展名(html、json或xml)支持自动“格式”选择。。。我的一些作品是这样的:

api_email:
resource: "@MApiBundle/Resources/config/routing_email.yml"
prefix: /
有些看起来像

api_images:
path:     /images/{listingId}/{width}/{fileName}
defaults: { _controller: ApiBundle:Image:view, listingId: null, width: null, fileName: null }
methods:  [GET]
requirements:
    fileName: .+

我知道如何向路线添加参数。但我想匹配控制器和动作,使其具有像/controller/action/params这样的路由…另一种方法是在注释仍然没有默认路由的情况下进行匹配。不,这是可能的。请看下面的答案。我认为奇怪的是,如果您使用控制台工具生成包,它将创建一个默认控制器,并通过注释定义路由。但是官方的书没有提到通过注释的路由——书中没有提到。如果这是默认设置,我认为应该指出并提供文档(或链接)。BASTA的评论:“Marc Melina美利奴:考虑这个用例——一个具有默认视图、单个帖子查看、留言簿、留言簿表单等的博客。对于默认视图,我不希望URL是格式<代码>。http://example.com/blog/slug,但只是
http://example.com/slug
。这将是网站的默认视图,当然没有什么可以被视为“例外”“。此外,让您的JS处理路由并动态加载应用程序视图是完全合理的,在这种情况下,所有路由都将提供基本布局,您的JS路由器将确定URL并呈现视图。这需要一个全面的路线Marc,我想你还没有听说过SEO,当重组一个站点时,改变路线有时是必要的,并且可能需要一个全面的路线来提供正确的重定向(301状态)工作,干杯,但只是为了增强:“Default”是你的控制器的类名(第一个字母大写,没有“控制器”部分)。此答案中显示的代码有问题,它需要路由名称。当前假定
模式:
为路由名称,
模式:
默认值:
要求:
需要在同一级别缩进。谢谢,这可能是我路由文件中的匆忙复制/粘贴作业!