Jas*_*vis 5 php oop model-view-controller url-routing
我正在尝试为个人使用构建一个不错的PHP框架.我知道有很多现有的,但是这是一个很好的学习经验,涵盖了绝大多数的不同的挑战,真的教了我很多,还有当我做,我希望能够用来开发其他项目有成品因为我正在构建它,所以应该没有关于如何使用它的学习曲线.
一些基本目标,
- 使用PHP面向对象而不是程序.
- 使用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
Run Code Online (Sandbox Code Playgroud)
我决定通过一个入口点来路由所有请求,index.php
我将构建一个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);
?>
Run Code Online (Sandbox Code Playgroud)
请注意
上面的代码是所有测试代码并且将会改变,这只是概念
所以你可以看到我计划有index.php中得到URI,检查对有效路径,如果找到,它将包括或建立一个头部分,然后将建设内容部分,然后最后的脚注部分这页纸.
如果您要访问例如... www.test.com/blogs/userid-32423/page-23
页面会......
现在基于我的文件夹结构.我相信上面例子中的博客类文件将被视为CONTROLLER.如果我是正确的,到目前为止,然后呼吁blogs-这个博客类> viewbyID(ID,页)viewbyID方法将设立一些代码,查询数据库,并建立了页面的一些变量,那么它可能包括一个博客模板文件.此博客模板文件可被视为VIEWS.
现在,我可能有这个整体概念不对的,这就是为什么我贴了这么多的代码和文本,试图解释就可以了我的视野,请给我的想法,建议,请告诉我,IM完全错误的,而且在那里我可能是在正确的轨道,我将非常感谢任何建设性的批评或思想.如果我在上面使用MVC模式的View,Controller部分是正确的,那么我的代码的哪一部分将被视为模态?由于某些原因,这对我来说有点混乱.
奖金问题...表格帖子怎么样,我应该在哪里处理这些?在我的例子中,我专注于博客模块,所以让我们说POST用于添加新博客条目和POST用于编辑博客条目,应该在哪里处理(模态,视图,控制器)?
控制器的工作是检查用户的输入并确定所请求的内容.一旦确定,就会调用模型.然后控制器获取模型的有效负载并将其提供给视图.
基本上,该模型是业务的模型.想要添加博客文章?然后Blog模型将有一个->add
或一个->save
方法(由控制器调用.博客控制器也可能有一个add
方法,但它不是用于与数据库交谈.它用于检查输入然后调用模型来实现保存).模型方法并不总是与数据库交互,但它们通常会这样做.
就添加/编辑而言,它们几乎总是共享相同的视图,并且如果可行则可以共享相同的控制器方法.
请记住,控制器是所有客户的入口点.应用程序处理的每个URL都应映射到控制器方法.然后控制器告诉模型要做什么,将用户输入传递给它.