我想构建一个很好的PHP框架供个人使用。我意识到存在许多存在,但这是一个很好的学习体验,涵盖了绝大多数不同的挑战,真正教会了我很多,并且当我完成后有一个完成的产品,我希望可以用来开发其他项目而且由于我正在构建它,因此应该没有关于如何使用它的学习曲线。这是如何在PHP中使用MVC模式OO
一些基本目标,
- 使用PHP Object Oriented而不是程序。
- 使用MVC或类似的东西了解更多关于这种风格。
- 轻量级和快速/性能好
这里是我的计划网站结构,排除了一些其他文件夹的JavaScript,图片,CSS,一些辅助功能/文件等
/// //////////网站结构/////////////
site.com/
/index.php
site.com/library/
/Config.class.php
/Photos.class.php
/Mail.class.php
/Filter.class.php
/QRcodes.class.php
/Router.class.php
/Database.class.php
/Templates.class.php
/etc, etc,etc......
site.com/modules/
/account/
/model
/views
/controllers
/users/
/model
/views
/controllers
/messages/
/model
/views
/controllers
/API/
/model
/views
/controllers
/forums/
/model
/views
/controllers
/blogs/
/model
/views
/controllers
/etc, etc, etc, etc.............
/model
/views
/controllers
我已经决定借道进入单点的所有请求,index.php文件
I wi我将构建一个Router类/对象,它将使用正则表达式将URI映射到可能的目标地图。下面是我有什么,现在这部分的一个片段:
<?php
//get url from URL
$uri = isset($_GET['uri']) ? $_GET['uri'] : null;
$uri_route_map = array(
//users/account like http://mysite.com/users/324 (any digit)
'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1',
'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1',
'users/friends/edit' => 'modules/users/friends/edit',
'users/friends/' => 'modules/users/friends/',
'users/online' => 'modules/users/online/' ,
'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1',
'users/create' => 'modules/users/create',
'users/settings' => 'modules/users/settings',
'users/logout(?<page_number>\d+)' => 'modules/users/logout',
'users/login' => 'modules/users/login',
'users/home' => 'modules/users/home',
//forums
'forums/' => 'modules/forums/index',
'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1',
'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1',
'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2',
'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2',
// TESTING new method to define class and page better!
'users/home' => array('PAGE CLASS NAME', 'ACTION NAME')
//blog routes coming soon
//mail message routes coming soon
//various other routes coming soon
);
//////////////////////////////////
class Router
{
public function __construct()
{
}
public function get_route($uri, array $uri_routes)
{
foreach ($uri_routes as $rUri => $rRoute) {
if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) {
//if page number and ID number in uri then set it locally
$page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null);
$id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null);
echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number;
$uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri);
echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>';
break;
}
}
$uri = explode('/', $uri);
}
}
$uri = new Router();
$uri = $uri->get_routes($_GET['uri'], $uri_route_map);
?>
请注意
上面的代码在所有测试代码和将会改变,它只是概念
S o正如你所看到的,我打算让index.php获取URI,根据有效路径检查它,如果找到了它,它将包含或构建一个头部分,然后将构建内容部分,最后是页脚部分这一页。
如果你访问例如...... www.test.com/blogs/userid-32423/page-23
该页面会...
- 构建头()
- 创建对象博客... $ blogs = new Blogs;
- call $ blogs-> viewbyID($ userID,$ paging); // $用户ID是32423和$分页现在会根据我的文件夹结构是23从URI
- 构建页脚部分
。我相信我们上面示例中的博客类文件将被视为CONTROLLER。如果我目前为止是正确的,那么这个正在调用blogs-> viewbyID(ID,PAGE)viewbyID方法的博客类将设置一些代码,查询数据库并为页面设置一些变量,然后它可以包括博客模板文件。这个博客模板文件可以被认为是VIEWS。
现在我可能把这个概念弄错了,这就是为什么我发布了太多的代码和文本来试图解释我的观点,请给我想法,建议,告诉我我完全错了什么,以及我在哪里可能会走上正轨,我会非常感谢任何建设性的批评或思想。如果我对MVC模式的View,Controller部分的上述用法正确,那么我的代码的哪部分将被视为Modal?出于某种原因,这对我来说有些困惑。
奖金问题...表格帖子怎么样,我应该在哪里处理?在我的示例中,我将重点放在博客模块上,因此可以说POST用于添加新的博客条目,POST用于编辑博客条目,应在哪里处理这些内容(模式,视图,控制器)?
'成品......我可以...用来开发其他项目......'平心而论,你应该真的用它来学习/拿走你的硬块,但是去专业开发的产品,比如CakePHP,Symfony ,CodeIgniter,Zend或其他使用良好的文档化解决方案之一。 :) – 2011-02-03 23:34:55