1

几年来我一直在编写程序,最近我决定跳到面向对象的代码。

为了帮助我站稳脚跟,我一直在开发自己的 MVC 框架。我知道 Zend 等等,但我只想要一些优雅和轻量级的东西,我可以 100% 理解所有内容并且可以积累知识。但是,我需要一点帮助和建议。

基本文件夹架构是:

/view/
/controller/
/model/
index
.htaccess

这些是我到目前为止的文件:

/.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z]*)/?(.*)?$ index.php?controller=$1&path=$2 [NC,L]

/index.php

//autoload new classes
function __autoload($class) 
{
    $folder = explode('_', $class);
    require_once strtolower(str_replace('_', '/', $class)).'_'.$folder[0].'.php';
}

//instantiate controller
if (!isset($_GET['controller'])) { $_GET['controller'] = 'landing'; }
$controller_name = 'controller_'.$_GET['controller'];
new $controller_name($_GET,$_POST); 

/controller/base_controller.php

abstract class controller_base
{   
    //store headers
    protected $get;
    protected $post;

    //store layers
    protected $view;
    protected $model;

    protected function __construct($get,$post)
    {    
        //store the header arrays
        $this->get = $get;
        $this->post = $post;

        //preset the view layer as an array
        $this->view = array();
    }

    public function __destruct()
    {
        //extract variables from the view layer
        extract($this->view);

        //render the view to the user
        require_once('view/'.$this->get['controller'].'_view.php');
    }
}

/controller/landing_controller.php

class controller_landing extends controller_base
{
    public function __construct($get,$post)
    {
        parent::__construct($get,$post);

        //simple test of passing some variables to the view layer     
        $this->view['text1']  = 'some different ';
        $this->view['text2']  = 'bit of text'; 
    }
}

问题 1) 这个框架的布局是否正确?

问题2)我应该如何将模型层集成到这个框架中?

问题 3) 关于如何改进这一点的任何其他建议?

4

1 回答 1

1

好吧,我会尽力回答最好的,我可以。

回答 Q1

嗯,这是主观的。如果这是您想要的工作方式,那么是的!我所做的不同之处在于,在我的 htaccess 中,我只是将“ http://domain.com/ ”之后的所有内容作为参数传递给 get-parameter,然后在我的 PHP 中处理数据。比如像这样:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule (.*) index.php?urlparam=$1 [NC,L,QSA]

然后在 PHP 中处理它:

$_GET['urlparam'];
# Do whatever here. Maybe explode by "/".

最后一件事是路由部分。我只是制作与 URL 匹配的模式。

例如 /advertisements/:id

导致 \Advertisements\Show

回答 Q2

当我需要将视图、模型、插件或任何其他文件加载到我的控制器中时,我正在运行我调用的加载类。这样,我确信该文件只加载一次。load-model 函数只返回一个带有模型的对象,这样我就可以实例化它,以后可以使用它。

回答 Q3

您可能应该阅读一些教程。我认为,Anant Garg 在本教程中很好地解释了它:http: //anantgarg.com/2009/03/13/write-your-own-php-mvc-framework-part-1/

但是其中有很多“在那里”:

例如这个:http ://www.phpro.org/tutorials/Model-View-Controller-MVC.html

或者这个提供 12 种不同方法的方法:http: //www.ma-no.org/en/content/index_12-tutorials-for-creating-php5-mvc-framework_1267.php

希望这可以帮助您朝着正确的方向前进,

祝你今晚愉快。:)

于 2013-11-03T01:18:50.330 回答