如何在PHP中路由URL?

时间:2011-05-14 10:07:39

标签: php routes rewrite

我正在尝试将url路由实现到我自己的mvc框架中,我想找到最好的方法来实现它。我在考虑三种解决方案。

  1. 创建一个XML文件并在我的前端控制器中读取它,然后加载匹配的控制器。
  2. 创建一个存储路由的表,然后在我的前端控制器中执行查询,然后加载匹配的控制器。
  3. 使用xml或table,然后将路由加载到memcache中,然后使用它。
  4. 我对#1和#2的关注是我必须为每次访问读取一个表或xml。 我对#3的关注是并非所有托管公司都支持memcache。

    任何建议都将不胜感激!

    补充:我觉得我困惑了一些人。通过“路线”,我实际上是在谈论改写...就像...我想在访问'/ hello'时将访问者重写为'/ controller / action'

    由于

3 个答案:

答案 0 :(得分:2)

我不会为此使用XML或表。这将需要额外的资源用于这种(相比较的)简单操作。你应该有一个由mod_rewrite加载的脚本,它解析URL,加载适当的控制器并执行动作。

答案 1 :(得分:0)

嘿,我知道这有点晚了,但请查看我的Routes class。我知道你现在可能不需要它,但希望它对其他人仍然有用。

通过这种方式,您可以使用简单的语法和规则轻松完成所需的操作。您所需要的只是分解返回的URL的部分(来自Routes::route()调用)以计算您的控制器和操作方法(以及任何可能的参数)。

此路由库不会为您执行此操作的原因是因为您在使用它时可能不在MVC世界中,但创建起来并不困难。因为它是如此低级别,你甚至可以动态创建路由,比如从数据库表或内存缓存。

答案 2 :(得分:0)

我想我可以重新分阶段甚至概括这个问题:

  • 您想为某些内容创建一个表示形式(在本例中为URL) 路由)易于人类阅读(例如,XML);
  • 您可能也希望这种表示很容易 计算机生成的(例如,来自数据库表);
  • 在运行时,您不希望解决方案变慢:例如,解析a 大型XML文件,从磁盘读取或从数据库中提取行。
  • 您不知道哪个缓存解决方案可用 生产环境。

所以你应该瞄准:

  • 执行慢速操作(从数据库读取,解析XML) 尽可能少 - 可能是在编译或构建阶段,或“在...上 先跑“。
  • 快速执行路由匹配:直接编译规则 进入PHP代码,并将它们作为正则表达式或类似表达式执行。
  • 将规则代码缓存为php文件,并将其作为常规代码包含在内。 APC 是一个PHP代码缓存,通常在所有生产中可用 的环境中。

这将使我使用以下类和方法实现解决方案:

Router :: addRoute(pattern,controller) - 添加路由 Router :: match(uri) - 返回匹配的控制器

您可以以您想要的任何格式存储路径(XML,Json,在数据库中),并生成一个简单的PHP包含文件,以便在运行时快速加载路由:

<?php
// compiled_routes.php
$router = new Router();
$router->addRoute('/', 'HomeController');
$router->addRoute('/widgets', 'WidgetsController');

tl; dr:将路由规则解析与路由匹配分开。仅执行一次规则解析,并将结果编译为可由APC缓存的PHP代码。

希望有所帮助。