我想知道如何在项目中创建codeigniter样式的url段。
除了捕获段的htaccess规则之外,如何在PHP中完成?
在窥探codeigniter源代码后,我找不到对捕获用法的htaccess文件的任何引用。
关于如何做到这一点的任何想法?
答案 0 :(得分:2)
假设您通过Apache mod_rewrite或Nginx将所有请求传递给index.php:
// Get the current URL path (only) and convert encoded characters back to unicode
$path = rawurldecode(trim(parse_url(getenv('REQUEST_URI'), PHP_URL_PATH), '/')));
// array merge with defaults
$segments = explode('/', $path) + array('home', 'index');
//First two segments are controller/method
$controller = array_shift($segments);
$method = array_shift($segments);
// @todo serious security checking here!
// Finally, load and call
$controller = new $controller;
$controller->$method($segments);
你的控制器看起来像这样
class Home
{
public function index($params)
{
print_r($params);
}
}
答案 1 :(得分:1)
你要做的是在htaccess中设置一个单独的url参数,然后使用字符串拆分方法从该字符串中检索模型,控制器和视图,然后调用模型类,控制器类,然后渲染将数据放入视图中。转型将如下所示:
mysite.com/index.php?url=/tasks/all
=> mysite.com/tasks/all
它调用任务模型,然后在任务控制器内调用名为“all()
”的函数。
一旦该网站重新上线,请查看教程的htaccess部分 - 他很好地展示了它的完成情况http://www.henriquebarroso.com/how-to-create-a-simple-mvc-framework-in-php/
答案 2 :(得分:1)
您仍然需要将所有虚拟请求“转发”到物理文件。
这个想法是,任何与磁盘上的物理文件或文件夹不匹配的URI都会被重写(通常通过mod_rewrite)到你的index.php文件(它通常是你的索引文件,所以直接调用索引也可以) ,它将URI附加到路径或作为查询字符串参数:
RewriteCond %{REQUEST_FILENAME} !-f # Not a real file
RewriteCond %{REQUEST_FILENAME} !-d # Not a real folder
RewriteRule ^(.*)$ index.php/$1 [L] # Rewrite to index.php, with a leading slash, followed by the URI
或者,您可以使用标准错误文档处理程序(仍然在.htaccess或apache配置中,但不需要mod_rewrite!):
<IfModule !mod_rewrite.c>
ErrorDocument 404 /index.php
</IfModule>
现在控制权被统一传递给index.php文件,您需要一个路由器机制来匹配到正确控制器的路由。理想情况下,您有一个静态和动态路由列表。静态路由是与URI的直接匹配,动态是正则表达式匹配。首先检查静态路由,因为它就像单个哈希查找一样简单,而你必须遍历所有动态路由。
为了提高性能,最好将更常见的动态路由放在列表的开头,最后放置一些不起眼的路径。
答案 3 :(得分:0)
使用.htaccess文件来使用mod_rewrite来重写url的基础对此至关重要。否则,浏览器会将每个段视为假定的文件夹或文件(取决于您是否有尾随/)
但是,如果你有这个,你可以简单地使用这篇文章中描述的方法: