0

我使用 CodeIgniter 已经有一段时间了,但主要是为了方便功能,例如国际化、cookie 和会话控制。我也喜欢它将我的观点与我的逻辑分开。我已经了解了诸如数据库访问之类的核心内容,这是人们使用 php 框架的核心原因之一,但我暂时还没有构建需要它的站点。

我找不到答案的一件事是关于相对路径。在我的 a 标签中,我总是放置完整的路径。例如

<a href="<?php echo '/' .$pageController . '/' . $pageMethod . '/' . $pageLanguage . '/home'; ?>">Home</a>

但是,我发现如果我只是把

<a href="home">Home</a>

只要我使用相同的控制器、方法和语言,它实际上就可以工作。我什至尝试过我的法语部分,它也有效。显然,要切换语言,我必须给出完整的路径。我认为这与 CI 无关,而是浏览器行为。

这种行为究竟是什么?当浏览器看到相对路径时,它是否查看当前路径,转到最近的 / 字符,删除它之后的所有内容并添加相对路径?我可以每次都指望这个吗?

4

1 回答 1

1

是的,你可以指望这种行为。使用斜杠分隔名称来标识页面的方法来自将这些字符串链接到文件夹位置的原始方法。因此,/users/halfer.html在动态路由流行之前,一个halfer.html名为 的文件夹中的文件users本来是一个文件,该文件夹本身位于 web/vhost 根目录中。

这意味着,如果您在该页面中,任何不以协议引用(例如http://)或正斜杠(即 vhost 根)开头的链接都是相对于当前地址的,因此BringMeAnother.html实际上会引用/users/BringMeAnother.html.

现在,使用现代路由,.html后缀是多余的,因此可以删除。但是,浏览器仍然支持相对链接的“基于文件夹”的方法。因此,此页面上的链接BringMeAnother将链接到路线/users/BringMeAnother


关于您的评论,我认为某些路由系统的实现是相当部分的。它们总是将 URI 路径转换为控制器、方法和参数,但它们并不都提供命名路由,因此可以避免路由硬连线。然而,这可能很容易添加到 CodeIgniter 中(当然,请检查它是否已经提供 - 它可能是!)。

这是一个例子。假设您的路由/users/:user_name指向控制器UserController和方法run,并且您手动连接此链接的每个用例。然后,您决定要将路线重命名为/browse/users/:user_name,这是一个问题,因为您已经在 20 个地方硬连线了它。

解决方案是通过允许您命名路由的方法添加路由。Symfony 1 通过以下语法做到这一点:

@users?user_name=halfer

这意味着名为“users”的路由将扩展到任何路由定义(例如/browse/users/halfer)。但是,我不建议您切换框架。只需添加一个自定义方法,根据路由定义存储名称(并自动将它们添加到您的路由系统),这样您就可以避免在每个用例中硬连线路由的样子。

于 2013-09-01T21:10:07.247 回答