我已经使用 CodeIgniter 一段时间了,但主要是为了方便的功能,如国际化、cookie 和会话控制。我也喜欢它将我的观点与我的逻辑分开。我已经了解了数据库访问等核心内容,这是人们使用 php 框架的核心原因之一,但我只是暂时没有构建需要它的网站。
我找不到答案的一件事是关于相对路径。在我的 a 标签中,我总是放置完整的路径。例如
<a href="<?php echo '/' .$pageController . '/' . $pageMethod . '/' . $pageLanguage . '/home'; ?>">Home</a>
但是,我发现如果我只是把
<a href="home">Home</a>
只要我使用相同的控制器、方法和语言,它实际上就可以工作。我什至在我的法语部分尝试过,它也有效。显然,要切换语言,我必须提供完整的路径。我认为这与 CI 无关,而是浏览器行为。
这种行为到底是什么?当浏览器看到相对路径时,它是否查看当前路径,转到最近的/字符,擦除其后的所有内容并添加相对路径?我能每次都指望这个吗?
是的,你可以指望这种行为。使用斜杠分隔的名称来标识页面的方法来自将这些字符串链接到文件夹位置的原始方法。因此,在动态路由流行之前,/users/halfer.html
应该是一个名为 users
的文件夹中halfer.html
的文件,该文件夹本身位于 web/vhost 根目录内。
这意味着,如果您在该页面中,任何不以协议引用开头的链接(例如 http://
( 或正斜杠(即虚拟主机根(是相对于当前地址的,因此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
(。但是,我并不是建议你切换框架。只需添加一个自定义方法,该方法根据路由定义存储名称(并自动将它们添加到路由系统(,这样您就可以避免在每个用例中硬连线