2011-02-03 115 views
5

我想构建一个很好的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用于编辑博客条目,应在哪里处理这些内容(模式,视图,控制器)?

+3

'成品......我可以...用来开发其他项目......'平心而论,你应该真的用它来学习/拿走你的硬块,但是去专业开发的产品,比如CakePHP,Symfony ,CodeIgniter,Zend或其他使用良好的文档化解决方案之一。 :) – 2011-02-03 23:34:55

回答

5

控制器的工作是检查用户的输入,并确定被请求的是什么。一旦确定,就调用模型。控制器然后获取模型的有效载荷并将其提供给视图。

基本上,该模型是一个模型的业务。想添加博客文章?然后博客模型将有一个->add或方法(这是由控制器调用的,博客控制器也可能有一个add方法,但它不适用于与数据库交谈,它用于检查输入,然后调用模型做实际的保存)。模型方法并不总是与数据库进行交互,但他们通常会这样做。

就添加/编辑而言,它们几乎总是共享相同的视图,并且如果可行的话,可以共享相同的控制器方法。

只要记住控制器是所有客户的切入点。应用程序处理的每个URL都应映射到控制器方法。控制器然后告诉模型做什么,将用户输入传递给模型。

+0

感谢这让我花了很长时间终于“得到它”,但我想我现在明白了 – JasonDavis 2011-07-19 22:47:04

3

您的模型应该是查询数据库的人员,而不是您的Controller。您的模型用于处理所有CRUD操作,并在必要时将结果传递回Controller以交给View。通常的流程是

Controller > Model > Controller > View