编写一个基本的PHP MVC,不知道如何开始

时间:2010-03-04 02:02:59

标签: php mysql mod-rewrite permalinks

我正在开发一个基于PHP和MySQL的个人项目,我正在做一些研究并玩弄重写。说我有一个网站......

http://www.myDomain.com/

我希望在域的根目录中有一个index.php或bootstrap。所以,如果你访问......

http://www.myDomain.com/admin/

它仍然会从域顶层的index.php加载,它处理配置文件的解析和加载,并将用户重定向到正确的位置,并在此过程中创建漂亮的链接。

我应该从哪里开始我的研究和教育?我有些不知所措。谢谢您的时间:))


更新

听起来我想要转向带前端控制器的MVC系统。关于编写我自己的MVC框架的任何好的参考(将是非常基本的)。老实说,我现在不想拉入Zend框架(会大量增加它!)

2 个答案:

答案 0 :(得分:2)

基本上,您将任何传入的请求重写为index.php。以下是Kohana框架中的.htaccess示例:

# Turn on URL rewriting
RewriteEngine On

# Protect application and system files from being viewed
# RewriteRule ^(application|modules|system) - [F,L]

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]

所以你的例子将被路由到index.php/admin。然后,您可以查看$_SERVER['REQUEST_URI']以确定下一步该做什么。

一个相对常见的模式是使用URI的第一段作为控制器,第二段作为方法。例如:

$segments = explode($_SERVER['request_uri'], '/');//array('admin')

if(isset($segments[0]))
{
    $class = $segments[0].'_controller';//'admin_controller

    if(isset($segments[1]))
         $method = $segments[1];
    else
         $method = 'index';
}
else
{
    $class = 'index_controller';
    $method = 'index';
}

$controller = new $class;
$controller->$method();

该代码绝不是生产准备好的,因为如果例如用户访问了不存在的控制器的URL,它将死于火热的死亡。它也不会像句柄参数那样做得很好。但这是PHP MVC框架如何运作背后的想法。

顺便说一句,你正在调用bootstrap的另一个名字是front controller。您可以谷歌该术语以查找有关该模式的更多信息。

答案 1 :(得分:1)

您需要查看配置.htaccess以在内部重写对引导程序文件的所有请求,可能是index.php

Kohana使用它来做到这一点

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

然后,您可以访问$_SERVER['REQUEST_URI']以开始将请求路由到控制器。