我目前正在框架上创建 CMS。我已经制作了我的 .htaccess 文件,它看起来像这样:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z]+)/(.*)$ index.php?url=$1 [PT,L]
</IfModule>
我的问题是:
1) 可以使用普通的 MVC URL 访问我的页面: http://example.com/pages/view/ {the-shorttag-of-the-page}
2) 我的页面也可以通过路由访问: http://example.com/p/ {the-shorttag-of-the-page}
我真正需要实现的是我可以通过两种方式访问它: http://example.com/ {the-shorttag-of-the-page} 或者有语言支持 http://example.com/ {lang}/{the-shorttag-of-the-page}
我的问题是我不想更改 mod_rewrite - 我更想在 PHP 中创建路由,但我无法找到如何路由到 PageController->view() 方法的解决方案条件中的静态字母(上例中的“p”)。
你明白我的问题了吗? 你有什么提示可以引导我朝着正确的方向前进吗?
最佳答案
这听起来像是您需要实现某种路由器。
我自己遇到过,这就是我如何让它工作得很好:
一些路由器类解析 URL。它将 URL 部分 (/en/controller/action/param1/paramval1/
) 分解成片段。它确定语言代码(如果未提供则默认)、 Controller 、操作等。
路由器还向系统的其他部分提供信息( Controller 、 Action 名称、参数),尽管您可以为此目的实现特殊类(例如请求)。
现在系统的不同部分可以通过 Router 或 Request 类访问给定的信息。从这里开始,实现多语言站点应该很容易。
再次强调,重要的部分是将 URL 映射到 Controller 和操作。当然,如果您不想要像 /controller/action/parameter1
这样的 URL,您应该有一些映射表(XML 文档/数据库表)将 stub (页面短标记)映射到 Controller 和操作.路由器读取这个表并根据给定的规则确定 Controller 、 Action 和其他参数。
希望我没有把事情复杂化太多:)
更新:
至于我自己,我已经使用 XML 文件实现了映射。让我进一步解释一下:路由器负责解析 URL。通常,您的 URL 会包含 Controller 和操作名称(在您的例子中,pages 是 Controller ,view 是操作)。
现在在您的情况下,您只需要一个 stub ,因此路由器必须以某种方式获取有关正在调用哪个 Controller 和操作的信息。这就是映射的目的,将 stub 映射到适当的 Controller 和操作。
我将其实现为静态路由,手动写入 XML 文件,但您可以使用某种插件类来检查 stub 是否确实与页面相关。如果不是,则可能意味着两件事:它是 Controller 或请求无效。
让我进一步谈谈冲突:如果 stub 与任何 Controller 的名称相同,就会发生冲突。您应该使用给定的 stub 呈现页面,还是调用 Controller ?这必须以某种方式解决,也许您可以通过编程方式限制用户拥有包含此类 stub 的页面。
此外,下次您深入研究使用 PHP 进行应用程序开发时,我建议您使用一些著名的 PHP 框架(如果您还没有,当然可以),例如Zend、Kohana 或 CodeIgniter。它们都提供路由器和许多其他组件,使开发应用程序变得更容易、更快和更安全。
关于具有多语言支持的 PHP 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859197/