2010-08-10 84 views
0

我想弄清楚什么是最好的方式去重写网址,以适应不仅一个目录结构,但为我正在建设的网站的菜单附加操作在PHP中。PHP动态URL写入,以适应动态菜单和路径

我有一个页面,可以根据加载的“页面”动态加载内容。包括根据页面的内容拉取。现在这是绑定到我的包含文件夹中的目录。所以文件夹/页面将包含includes/folder/page.php。

如果我有一个像“root/page/action/param”这样的结构,只要我说“在这个地方的任何东西都是这个”就可以正常工作。但是当我开始添加拥有不同级别页面的文件夹时,我遇到了麻烦。如果我将页面展开到“文件夹/子文件夹/页面”,然后使用展示位置来确定窗口的内容。我正在考虑使用像连字符一样的分隔符去“root/folder-subfolder1-subfolder2-page/action/param”,这样我就可以很容易地识别页面,但我不太喜欢这个选项。

我也不喜欢将我的includes目录结构绑定到我的url,但我认为要避免的唯一的另一种方式是使用内存中的对象来处理究竟在哪里。但我想避免这种情况,因为我希望菜单是动态的,基于XML文件进行解析并生成相应的url。我不想要解析xml的开销,不仅需要生成URL,还需要动态生成一个内存对象,该对象具有看似任意的规则。

有什么建议吗?

回答

1

PHPonTrax使用,我认为会允许这种类型的路由要实现,而且它是开源的,所以你可以看看的代码一些启发。 (注意:我没有对框架做出任何判断,我只是看过代码,并认为它可能适用于您)。

基本上,您将路由存储在数组中,并且您还提供了一些占位符,以便在给定路径之后可以有多个可能的控制器/操作/ ID。

所以,如果$路线[]是我们的数组来保存所有的,我们还可以添加:

$routes[0]['path'] = "foo/bar/:controller/:action"; 
$routes[0]['params'] = null; 
$routes[1]['path'] = "baz/:action"; 
$routes[1]['params'] = array("controller"=>"blah"); 
$routes[2]['path'] = "catalog/:id"; 
$routes[2]['params'] = array("controller"=>"products", "action"=>"view"); 
$routes[3]['path'] = ":controller/:action/:id"; 
$routes[3]['params'] = null; 

“:控制器”,“:行动”,和“:ID”是独特的标记,指示你允许令牌在路径中表示。因此,“/ baz/edit”,“/ baz/delete”,“/ baz/create”,“/ baz/funkify”等都是有效的控制器“blah”具有编辑,删除,创建和funkify方法。如果路径是“/ catalog/1234”,那么'1234'是id,它是一个有效的路径,当且仅当您可以找到id = 1234的产品。如果您的请求是“/ products/dothis/12345”,则路由0-2不匹配,但路由3不会,因此您可以查找名为“products”的控制器文件,并提供一个名为“ dothis“,那么你可以打电话给”dothis(12345)“。显然,如果没有“dothis”方法,或者找不到“12345”,则这是一条无效路径,您可以引发异常。注意你需要提供一个默认路由,在这种情况下它是$ routes [3]。

在你的文件结构,你可以有:

/应用
    /控制器
    /视图
    /等,等

可能的缺点是,你重写,你发送每个请求到一个PHP脚本。

如果您感兴趣:PHPonTrax。您将需要查看路由器类和action_controller类(请参阅process_route()和recognition_route()方法)。

+0

谢谢。我最终基本上用一些自定义路由和正则表达式来做这件事。 ASP.NET MVC的路由表设计也帮助我走出了很多问题。 – kappasims 2010-11-02 02:43:46

0

使用绝对路径而不是相对在您的菜单html &脚本,你不应该有问题,因为它将始终指向正确的来源。

绝对路径示例(注意/):

<a href="/">Home</a> 
<a href="/services">Services</a> 
<a href="/mypage">My Page</a> 
<a href="/mypage2">My Page 2</a> 
+0

我实际上是在讨论为我的MVC应用程序重写URL。 /root/page/action/param将被重写为root/index.php?page = page&action = action&param = param。我的问题是,页面可能包含页面的路径而不仅仅是页面名称。 – kappasims 2010-08-10 20:18:34