LUCKY

Welcome to Us !

写一个自己的PHP框架(二)

lucky PHP 2019/05/20

上一篇文章写了框架的目录结构和路由类,接下来我们来写一下MVC中的另一个核心的类——view基类。

在fast下面新建一个View.php文件:


// +----------------------------------------------------------------------
namespace core\fast;
use core\fast\Conf;

class View 
{
	public  $_assign = [];
	public  $_module;
	public  $_controller;
	public  $_action;
	public function __construct()
	{
		$this->get_module();
		$this->_controller = 'Index';
		$this->_action     = 'Index';
	}
	//存储变量
	public function assign($name,$value){
		$this->_assign[$name] = $value;
	}
	//渲染视图
	public function view($views = ''){
		//是否自定义视图
		if(!empty($views)){
			$this->view_explode($views);
		}
		$file = APP_PATH . '/template/views/'.$this->_module.'/'.$this->_controller.'/'.$this->_action.'.html';
		//判断视图是否存在
		if(is_file($file)){
                      include($file); 
		}else{
			throw new \Exception("找不到视图文件".$this->_module.'/'.$this->_controller.'/'.$this->_action.'.html');
		}
	}
	//不使用默认模板就分割
	public function view_explode($views){
		$viewarray = explode('/',$views);
		$viewarray = array_filter($viewarray);
		if(count($viewarray) == 3){
			$this->_module = array_shift($viewarray);
		}
		krsort($viewarray);
		if(!empty($viewarray)){
			$this->_action = array_shift($viewarray);
		}
		if(!empty($viewarray)){
			$this->_controller = array_shift($viewarray);
		}
	}

	public function get_module(){
		$modulearry = get_class($this);
		$modulearry = explode('\\', $modulearry);
		$modulearry = array_filter($modulearry);
		$this->_module = strtolower(end($modulearry));
	}
}

get_module这个方法是获取模块名的,假如你访问了是的app\controller\index\Index.php那么$this->_module就是index。

再assign方法里面是为了存储变量,可以再页面中输出

在view的方法里面就是来判断和include视图的html页面。

接下来我们在template里面新建一个文件views,这里面就是存在我们的视图html页面的,然后在新建一个index文件,这是存在的是前台所有的html页面,假如你有想有一个存在后台html的地方,你也可以新建一个admin文件来放后台的html的页面,接下来我们在index文件夹里面在新建一个index文件夹,这个index文件夹对应就是app\controller\index\Index.php下面的所有html的页面,然后在里面新建一个index.html和demo.html。

接下来要介绍MVC中另一个重要的,就是controller基类。

在fast下面新建一个Controller.php文件:


// +----------------------------------------------------------------------
namespace core\fast;

class Controller extends View
{
		public function __construct()
	{

		parent::__construct();
	} 
}

这个里面就只需要写这些就够了,集成一下view基类。

上一篇中我们在app\controller\index下面建立了一个index.php,这次接着用,这次要在里面改一点东西。

<?php
namespace app\controllers\index;
use core\fast\Controller;


class Index extends Controller
{

	public function __construct()
	{
		parent::__construct();
	}
	public function index(){	
		//上一篇文章写的
                 //echo 这是index';
		assign('data','index');
		return $this->view();
	}
	public function demo(){
		//上一篇文章写的
                 //echo 这是demo';
		return $this->view('demo');
	}

}

这里面继承了Controller基类,继承好之后可以在index方法里直接调用view里面的方法。

接下来我们访问一下http://www.demophp.nn/(这是我自己再本地建立虚拟域名)会显示

接着我们在访问一下http://www.demophp.nn/index/demo会显示

这样我们的简易版view和controller基类就完成l了,下一篇就可以写MVC中另一个重要的Model类了。