Symfony2 中生成的 URL 的用例?
Use cases for generated URLs in Symfony2?
来自直接 PHP 和 Drupal 背景,我最近正在学习 Symfony2 框架。目前我在本书的路由章节中。这可能是一个简单的问题。
有哪些现实世界的用例可以说明为什么人们想要在 Symfony 应用程序中生成 URL?我理解代码,但我在确定它时遇到了一些问题实际应用。
我指的是 this section 如果你需要复习一下。
一如既往,谢谢!
P.S。 Symfony 很棒。 :)
因为,假设您想更改给定页面 URL 并且您已将其硬编码到 10 个 Twig 模板中。您将必须修改所有这些文件。相反,当使用路由组件时:
- 您只需更改定义路由的 URL。
- 路由组件"takes"关心你当前使用的环境(dev,prod...)
另请注意,"switch environment" 是一种不好的做法,一个典型的问题是在 Javascript 中硬编码 URL。在这种情况下,您可以使用像 FOSJsRoutingBundle.
这样的包在 Javascript 中公开您的 Symfony2 路由
我几乎立即意识到它们的用途,现在我觉得很傻。 :) 对于那些以后停止回答这个问题的人:
关于生成 URL 的注意事项:
- 类似于 Drupal
l()
功能,有时您需要根据各种参数在应用程序内部生成链接。
- 您并不总是希望对链接进行硬编码,以防您决定在某个时候更改路径。
总结:将此视为在整个应用程序中使用带有 href
元素的直接锚标记的替代方法,而是保持动态。
用例
在我工作的项目中,我使用 generateUrl
来重定向用户
创建、编辑实体后。
例如,在创建服务实体后,我将用户重定向到视图
刚刚创建的服务。
控制器
return $this->redirect($this->generateUrl('myentity_view', array('id'=> $id)));
补充说明
在 twig 文件中,您可以使用 path
函数调用路由组件并生成具有给定路由名称和参数的 url。
基本上,只要您需要 link 到应用程序中的任何位置,您都需要生成一个 URL。
假设您有一个应用程序需要管理一些用户。这意味着您可能会有 URL,例如 /user/create
、/user/edit/(user id)
和 /user/remove/(user id)
。
每当您显示 link 来编辑用户时,您需要知道在什么 URL 上可以找到允许您编辑用户的页面。所以你需要link到/user/edit/(user id)
。一种解决方案是将其固定为 link,这样您就可以在代码中编写
<a href="/user/edit/<?= $currentUser->getId() ?>">edit this user</a>
但是如果你想改变这个URL方案怎么办?假设有人对"user"这个词不满意,毕竟这个系统管理的人不仅仅是用户,他们实际上是"person"!所以现在你需要更改所有包含 "user" 的 URL。您的应用程序中可能有很多地方您必须对这些 URL 进行硬编码,现在您需要找到并更改所有这些地方。呃
但不要害怕,因为 Symfony 路由可以拯救!
我们可以简单地让 Symfony 路由器为我们生成它们,而不是对这些 URL 进行硬编码。这意味着我们首先需要告诉 Symfony 我们有哪些路由,例如通过将以下 YAML 代码添加到我们的路由配置文件中:
user_edit:
path: /user/edit/{userId}
defaults: { _controller: AppBundle:User:edit }
requirements:
userId: \d+
这告诉我们的应用程序 "Okay, whenever somebody requests a page that looks like /user/edit/{userId}
, then you need to call the editAction
method in our UserController
class in the AppBundle
namespace and you need to pass the userId
as a parameter. Oh, and also you should only call the controller if userId
is a valid integer with at least one number."
这就是 Symfony 知道如何将 URL 映射到控制器的方式。但随之而来的好处是我们也可以将此信息用于相反的方式。
通常,在我们的应用程序中,我们并不真正关心 URL 看起来像我们想要执行的特定操作。我们所知道的是,当单击某个 link 时,浏览器应该跳转到允许我编辑用户的页面。由于我们刚刚定义了一条路线,将我们带到那里,我们可以让 Symfony 生成正确的 URL 来实现这一点。
因此,在您看来,您现在可以丢弃之前的硬编码 URL,并将其替换为 Symfony 路由器生成的路由:
<a href="<?= $view['router']->generate('user_edit', ["userId" => $currentUser->getId()]) ?>">edit this user</a>
现在,每当您需要更改 URL 的实际外观时,您需要做的就是编辑路由配置,而不是大量单独的视图。
来自直接 PHP 和 Drupal 背景,我最近正在学习 Symfony2 框架。目前我在本书的路由章节中。这可能是一个简单的问题。
有哪些现实世界的用例可以说明为什么人们想要在 Symfony 应用程序中生成 URL?我理解代码,但我在确定它时遇到了一些问题实际应用。
我指的是 this section 如果你需要复习一下。
一如既往,谢谢!
P.S。 Symfony 很棒。 :)
因为,假设您想更改给定页面 URL 并且您已将其硬编码到 10 个 Twig 模板中。您将必须修改所有这些文件。相反,当使用路由组件时:
- 您只需更改定义路由的 URL。
- 路由组件"takes"关心你当前使用的环境(dev,prod...)
另请注意,"switch environment" 是一种不好的做法,一个典型的问题是在 Javascript 中硬编码 URL。在这种情况下,您可以使用像 FOSJsRoutingBundle.
这样的包在 Javascript 中公开您的 Symfony2 路由我几乎立即意识到它们的用途,现在我觉得很傻。 :) 对于那些以后停止回答这个问题的人:
关于生成 URL 的注意事项:
- 类似于 Drupal
l()
功能,有时您需要根据各种参数在应用程序内部生成链接。 - 您并不总是希望对链接进行硬编码,以防您决定在某个时候更改路径。
总结:将此视为在整个应用程序中使用带有 href
元素的直接锚标记的替代方法,而是保持动态。
用例
在我工作的项目中,我使用 generateUrl
来重定向用户
创建、编辑实体后。
例如,在创建服务实体后,我将用户重定向到视图 刚刚创建的服务。
控制器
return $this->redirect($this->generateUrl('myentity_view', array('id'=> $id)));
补充说明
在 twig 文件中,您可以使用 path
函数调用路由组件并生成具有给定路由名称和参数的 url。
基本上,只要您需要 link 到应用程序中的任何位置,您都需要生成一个 URL。
假设您有一个应用程序需要管理一些用户。这意味着您可能会有 URL,例如 /user/create
、/user/edit/(user id)
和 /user/remove/(user id)
。
每当您显示 link 来编辑用户时,您需要知道在什么 URL 上可以找到允许您编辑用户的页面。所以你需要link到/user/edit/(user id)
。一种解决方案是将其固定为 link,这样您就可以在代码中编写
<a href="/user/edit/<?= $currentUser->getId() ?>">edit this user</a>
但是如果你想改变这个URL方案怎么办?假设有人对"user"这个词不满意,毕竟这个系统管理的人不仅仅是用户,他们实际上是"person"!所以现在你需要更改所有包含 "user" 的 URL。您的应用程序中可能有很多地方您必须对这些 URL 进行硬编码,现在您需要找到并更改所有这些地方。呃
但不要害怕,因为 Symfony 路由可以拯救!
我们可以简单地让 Symfony 路由器为我们生成它们,而不是对这些 URL 进行硬编码。这意味着我们首先需要告诉 Symfony 我们有哪些路由,例如通过将以下 YAML 代码添加到我们的路由配置文件中:
user_edit:
path: /user/edit/{userId}
defaults: { _controller: AppBundle:User:edit }
requirements:
userId: \d+
这告诉我们的应用程序 "Okay, whenever somebody requests a page that looks like /user/edit/{userId}
, then you need to call the editAction
method in our UserController
class in the AppBundle
namespace and you need to pass the userId
as a parameter. Oh, and also you should only call the controller if userId
is a valid integer with at least one number."
这就是 Symfony 知道如何将 URL 映射到控制器的方式。但随之而来的好处是我们也可以将此信息用于相反的方式。
通常,在我们的应用程序中,我们并不真正关心 URL 看起来像我们想要执行的特定操作。我们所知道的是,当单击某个 link 时,浏览器应该跳转到允许我编辑用户的页面。由于我们刚刚定义了一条路线,将我们带到那里,我们可以让 Symfony 生成正确的 URL 来实现这一点。
因此,在您看来,您现在可以丢弃之前的硬编码 URL,并将其替换为 Symfony 路由器生成的路由:
<a href="<?= $view['router']->generate('user_edit', ["userId" => $currentUser->getId()]) ?>">edit this user</a>
现在,每当您需要更改 URL 的实际外观时,您需要做的就是编辑路由配置,而不是大量单独的视图。