我已经在程序上编写了好几年了,最近我决定实现面向对象的代码。
为了帮助我站稳脚跟,我一直在研究自己的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)有关如何改进此问题的其他建议吗?
答案 0 :(得分:1)
好吧,我会尽力回答最好的问题。
嗯,这是主观的。如果这是你想要的工作方式,那就是!我做的不同的是,在我的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匹配的模式。
E.g。 /广告/:ID
导致\ Advertisements \ Show
当我需要将视图,模型,插件或任何其他文件加载到我的控制器中时,我正在运行一个load-class。以这种方式,我确信,该文件只加载一次。 load-model函数只返回一个带有模型的对象,这样我就可以实例化它,以后可以使用它。
您应该阅读一些教程。我想,Anant Garg在本教程中解释得非常好:http://anantgarg.com/2009/03/13/write-your-own-php-mvc-framework-part-1/
但其中有很多“在那里”:
E.g。这一个: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
希望这能帮助你朝着正确的方向前进,
祝你有个美好的夜晚。 :)