自己动手创建简单的MVC框架
// create a virtual host
>mkdir -p /var/www/layne.com/document_root
>cd /etc/apache2/sites-avaliable
>pico -w layne.com 或者 随便建一个文件,用gedit打开,save as layne.com
<VirtualHost *:8060>
DocumentRoot /var/www/layne.com/document_root
ServerName layne.com
</VirtualHost>
>a2ensite layne.com
>sudo service apache2 reload
or
>/etc/init.d/apache2 reload
切记:
NameVirtualHost *:8060
Listen 8060
要修改/etc/apache2/ports.conf,加入监听端口,否则无法访问
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>mkdir -p document_root/images document_root/styles >mkdir -p application/models application/views application/controllers >find >gedit document_root/index.php hello world! >gedit document_root/.htaccess RewriteEngine on RewriteRule !\.(js|gif|jpg|png|css)$ index.php //make sure apache trun on mod_rewrite.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//document_root/index.php
<?php
//import component
require_once('../application/models/front.php');
require_once('../application/models/icontroller.php');
require_once('../application/models/view.php');
//import controller
require_once('../application/controllers/index.php');
//initial front controller
$front = FrontController::getInstance();
$front->route();
echo $front->getBody();
die;
?>//application/models/front.php
<?php
class FrontController{
protected $_controller,$_action,$_params,$_body;
static $_instance;
public static function getInstance(){
if(!self::$_instance instanceof self){
self::$_instance = new self();
}
return self::$_instance;
}
private function __construct(){
try {
$request = $_SERVER['REQUEST_URI'];
$splits = explode('/',trim($request,'/'));
$this->_controller = !empty($splits[0]) ? $splits[0] : 'index';
$this->_action = !empty($splits[1]) ? $splits[1] : 'index';
if(!empty($splits[2])){
$keys = $values = array();
for($idx = 2; $idx< count($splits); $idx++){
if($idx%2==0){
$keys[] = $splits[$idx];
}else{
$values[] = $splits[$idx];
}
}
$this->_params = array_combine($keys,$values);
}
} catch (Exception $e) {
throw $e->getMessage();
return $e->getTrace();
}
}
public function route(){
if(class_exists($this->getController())){
$rc = new ReflectionClass($this->getController());
if($rc->implementsInterface('IController')){
if($rc->hasMethod($this->getAction())){
$controller = $rc->newInstance();
$method = $rc->getMethod($this->getAction());
$method->invoke($controller);
}else{
throw new Exception('Action');
}
}else{
throw new Exception('Interface');
}
}else{
throw new Exception('Controller');
}
}
public function getController(){
return $this->_controller;
}
public function getParams(){
return $this->_params;
}
public function getAction(){
return $this->_action;
}
public function getBody(){
return $this->_body;
}
public function setBody($body){
$this->_body = $body;
}
}
?>
//application/models/icontroller.php
<?php
interface IController{
}
?>//application/models/view.php
<?php
class View extends ArrayObject{
public function __construct(){
parent::__construct(array(),ArrayObject::ARRAY_AS_PROPS);
}
public function render($file){
ob_start();
include(dirname(__FILE__). '/' . $file);
return ob_get_clean();
}
}
?>
//application/controllers/index.php
<?php
class index implements IController{
public function __construct(){}
public function index(){
$fc = FrontController::getInstance();
$params = $fc->getParams();
$view = new View();
$view->name = $params['name'];
$result = $view->render('../views/index.php');
$fc->setBody($result);
}
}
?>//application/views/index.php Hello, <?php echo $this->name;?>!
output buffering
ArrayObject
点击打开链接http://www.php.net/manual/zh/class.arrayobject.php
这里的ArrayObject只是用来存放要set到view中去的对象,当然这些对象你也可以用自定义的容器来存放,比如一个自定义的对象数组。
cakephp里用的是一个单例模式的ClassRegistry的__objects数组来存放的。
function addObject($key, &$object) {
$_this =& ClassRegistry::getInstance();
$key = Inflector::underscore($key);
if (!isset($_this->__objects[$key])) {
$_this->__objects[$key] =& $object;
return true;
}
return false;
}

浙公网安备 33010602011771号