我正在试图弄清楚重写网址的最佳方法,不仅要适应目录结构,还要为我用PHP构建的网站的菜单附加操作。
我有一个页面根据正在加载的“页面”动态加载内容。根据页面的内容拉取包含。现在,这与我的包含文件夹中的目录相关联。因此文件夹/页面将包含includes / folder / page.php。
如果我有一个像“root / page / action / param”这样的结构,只要我说“网址中这个地方的任何东西就是这个”,它就能正常工作。但是当我开始添加包含不同级别页面的文件夹时,我遇到了麻烦。如果我将页面分解为“文件夹/子文件夹/页面”,然后使用放置来确定窗口的内容。我正在考虑使用像连字符这样的分隔符去“root / folder-subfolder1-subfolder2-page / action / param”,这样我就可以轻松识别页面,但我真的不喜欢这个选项。
我也不太喜欢将我的包含目录结构绑定到我的网址,但我想要避免的另一种方法是让内存中的对象来处理究竟在哪里。但我希望避免这种情况,因为我希望菜单是动态的,基于XML文件进行解析并相应地生成URL。我不想要解析xml的开销,不仅要生成URL,还要动态生成一个看似随意的规则的内存中对象。
有什么建议吗?
答案 0 :(得分:1)
PHPonTrax使用了我认为允许这种类型的路由的实现,并且它是开源的,因此您可以查看代码以获得一些灵感。 (注意:我没有对框架做出任何判断,我只是看过代码并认为它可能适合你)。
基本上,您将路径存储在一个数组中,并提供一些占位符,以便在给定路径后可以有多个可能的控制器/操作/ ID。
因此,如果$ routes []是我们保存所有内容的数组,我们可以添加:
$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;
“:controller”,“:action”和“: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]。
在您的文件结构中,您可以:
/应用
/控制器
/视图
/ etc等
可能的缺点是,在重写时,您将每个请求发送到一个PHP脚本。
如果您对此感兴趣:PHPonTrax。您将需要查看路由器类和action_controller类(请参阅process_route()和recogn_route()方法)。
答案 1 :(得分:0)
在菜单html&中使用绝对路径而不是亲戚脚本,你不应该有问题,因为它总是指向正确的来源。
绝对路径示例(注意/):
<a href="/">Home</a>
<a href="/services">Services</a>
<a href="/mypage">My Page</a>
<a href="/mypage2">My Page 2</a>