Symfony2中生成的URL的用例?

时间:2015-01-24 14:45:43

标签: php symfony url-routing

来自直接的PHP和Drupal背景,我最近在学习Symfony2框架。目前我在本书的路由章节。这可能是一个简单的问题。

为什么人们想要在Symfony应用程序中生成URL,有哪些真实世界的用例?我理解代码但我确定其实际应用程序时遇到了一些麻烦。

如果您需要复习,我指的是this section

一如既往,谢谢!

P.S。 Symfony很棒。 :)

4 个答案:

答案 0 :(得分:3)

基本上,只要您需要链接到应用程序中的任何位置,就需要生成URL。

假设您有一个需要管理某些用户的应用程序。这意味着您可能拥有/user/create/user/edit/(user id)/user/remove/(user id)等网址。

每当您显示编辑用户的链接时,您需要知道哪些URL可以找到允许您编辑用户的页面。因此,您需要链接到/user/edit/(user id)。一种解决方案是将其作为固定链接,以便在您的代码中编写

<a href="/user/edit/<?= $currentUser->getId() ?>">edit this user</a>

但是如果你想改变这个URL方案怎么办?让我们说有人对“用户”一词不满意,在这个系统管理的所有人不仅是用户之后,他们实际上是“人”!所以现在你需要更改包含“user”的所有URL。您的应用程序中可能有很多地方您必须对这些URL进行硬编码,现在您需要查找并更改所有这些URL。 Eugh。

但不要害怕,因为Symfony路由拯救了!

我们可以简单地让Symfony路由器为我们生成这些URL,而不是对这些URL进行硬编码。这意味着我们首先需要告诉Symfony我们有哪些路线,例如通过将以下YAML代码添加到我们的路由配置文件:

user_edit:
  path:     /user/edit/{userId}
  defaults: { _controller: AppBundle:User:edit }
  requirements:
      userId:  \d+

这告诉我们的应用程序“好的,只要有人请求的页面看起来像/user/edit/{userId},那么您需要在editActionUserController中调用AppBundle方法命名空间,你需要传递userId作为参数。哦,如果userId是一个至少有一个数字的有效整数,你也应该只调用控制器。“

所以这就是Symfony如何知道如何将URL映射到控制器。但随之而来的好处是我们也可以反过来使用这些信息。

通常,在我们的应用程序中,我们并不关心我们想要执行的某个操作的URL是什么样的。我们所知道的是,当点击某个链接时,浏览器应跳转到允许我编辑用户的页面。因为我们刚刚定义了一条将我们带到那里的路线,所以我们可以让Symfony生成正确的URL来实现这一目标。

因此,在您的视图中,您现在可以丢弃之前的硬编码URL,而是将其替换为Symfony路由器生成的路由:

<a href="<?= $view['router']->generate('user_edit', ["userId" => $currentUser->getId()]) ?>">edit this user</a>

现在,只要您需要更改URL的实际状态,您只需要编辑路由配置而不是很多单独的视图。

答案 1 :(得分:2)

因为,想象一下您想要更改给定的页面URL,并且您已经在10个Twig模板中对其进行了硬编码。您将不得不修改所有这些文件。相反,当使用路由组件时:

  • 您只需要更改定义路由的URL。
  • 路由组件&#34;采取&#34;照顾你正在使用的当前环境(dev,prod ...)

另请注意,切换环境&#34;是一种不好的做法,典型的问题是在Javascript中对URL进行硬编码。在这种情况下,您可以使用FOSJsRoutingBundle之类的包在Javascript中公开您的Symfony2路由。

答案 2 :(得分:1)

我几乎立即意识到他们的使用,现在我觉得很傻。 :)对于那些在将来停止这个问题的人:

关于生成网址的说明:

  • 与Drupal l()功能类似,有时您需要根据各种参数在应用程序内生成链接。
  • 如果您决定在某个时间段更改路径,则不一定要对链接进行硬编码。

总结:将此视为在整个应用中使用带有href元素的直接锚标记的替代方法,而是保持动态。

答案 3 :(得分:0)

用例

在我正在工作的项目中,我使用generateUrl来重定向用户 创建后,编辑实体。

例如,在创建服务实体后,我将用户重定向到视图 刚刚创建的服务。

控制器

return $this->redirect($this->generateUrl('myentity_view', array('id'=> $id)));

附加说明

在twig文件中,您可以使用调用路由组件的path函数,并使用给定的路由名称和参数生成URL。