MVC框架之從零開始(二)

上一篇博客講了我們可以通過路由類解析url;取得控制器以及對應方法;下面開始

加載控制器

首先在APP(應用項目)文件下建立ctrl(控制器)文件;其次建立控制器文件indexCtrl(爲了防止和其他文件衝突結尾加ctrl),

<?php
namespace app\ctrl;
class indexCtrl extends \core\imooc
{
    public function index()
    {
      p('hell');//隨意數值方便
    }
}


?>

回到immoc加載類


class imooc
{
    public static $classMap=array();
    public $assign;
    static public function run()
    {
        $route=new \core\lib\route();
        //p($route);
        $ctrlClass=$route->ctrl;//調用控制器
        $action=$route->action;//調用方法
        $ctrlfile=APP.'/ctrl/'.$ctrlClass.'ctrl.php';
        $ctrlClass='\\'.MODULE.'\ctrl\\'.$ctrlClass.'Ctrl';//爲了符合規範把app定義爲變量MODULE;再入口文件用define('MODULE','app');定義
        //p($ctrlfile);exit();
        if(is_file($ctrlfile)){//判斷控制器是否存在
            include $ctrlfile;;//引用控制器頁
            $ctrl=new $ctrlClass;//實例化控制器
            <span style="color:#FF0000;">$ctrl->$action();//調用方法成功</span>
        }else{
            throw new \Exception('找不到控制器'.$ctrlClass);
        }
    }

模型類

就是在控制器中連接一下數據庫:首先需要建立model(在lib目錄下)文件

<?php
namespace core\lib;
//use \core\lib\model;
use core\lib\conf;
class model extends \PDO//繼承PDO可以直接使用
{
    public function __construct()
    {
        //連接數據庫
        $dsn='mysql:host=127.0.0.1;dbname=jiance';
        $username='root';
        $passwd='root';
       
        try{
            parent::__construct($dsn, $username, $passwd);
        } catch(\PDOException $e){
            p($e->getMessage());
        }
    }
}

?>

然後在控制器中調用
<pre name="code" class="php"><?php
namespace app\ctrl;
class indexCtrl extends \core\imooc
{
    public function index()
    {
        
        
        $model=new \core\lib\model();//實例化model類;
        $sql="select * from lists";//sql語句
        $ret=$model->query($sql);//執行$sql語句
        $data=$ret->fetchAll();
       <span style="color:#FF0000;"> p($data);//輸出則連接成功;</span>
    }
}


?>

視圖類

視圖層功能就是接收控制層的數據展示出來;首先新建視圖文件index.html(在app下新建views目錄下新建)

<?php
namespace app\ctrl;
class indexCtrl extends \core\imooc
{
    public function index()
    {
       
        $data='你好,人類';
        $title='視圖文件';
       
        $this->assign('title',$title);
        $this->assign('data',$data);//通過此方法輸出數據
        $this->display('index.html');//通過display連接視圖層
    }
}


?>
創建assign和display方法

 
<pre name="code" class="php">public $assign;定義儲存


public function assign($name,$value)//接收數據,把數據寫入assign以$name爲名 { $this->assign[$name]=$value; } public function display($file)//接收文件名 { $file=APP.'/views/'.$file;//拼寫視圖文件路徑; if(is_file($file)){//判斷文件是否存在 //p($this->assign);exit(); extract($this->assign);//通過extract打散數組將值賦予鍵名形成變量 include $file; }; }


最後在視圖文件中輸出

<body>

<h2>這是視圖文件</h2>
<?php echo p($data); ?>
<?php echo p($title); ?>
</body>
</html>

成功輸出到視圖層,這樣我們就完成了一個簡單甚至簡陋的視圖文件

回顧總結

①我們定義了一些全局常量

//定義當前框架所在根目錄;realpath獲取當前位置
define('IMOOC',realpath('./'));
//定義核心文件所處目錄
define('CORE',IMOOC.'/core');
//項目文件所處目錄
define('APP',IMOOC.'/app');
//規範代碼;
define('MODULE','app');
//是否開啓調試模式
define('DEBUG',true);

②加載了函數褲

//加載函數庫
include CORE.'/common/function.php';
include CORE.'/imooc.php';
<pre name="code" class="php">spl_autoload_register('\core\imooc::load');//通過他實現了自動加載類

③調用了基礎類方法:通過它調用了路由類,實現瞭解析URL,找到控制器和方法

\core\imooc::run();

<pre name="code" class="php">static public function run()
    {
        \core\lib\log::init();
       // \core\lib\log::log('你好,人類s');
        //p('ok');
        $route=new \core\lib\route();
        //p($route);
        $ctrlClass=$route->ctrl;
        $action=$route->action;
        $ctrlfile=APP.'/ctrl/'.$ctrlClass.'ctrl.php';
        $ctrlClass='\\'.MODULE.'\ctrl\\'.$ctrlClass.'Ctrl';
        //p($ctrlClass);exit();
        if(is_file($ctrlfile)){
            include $ctrlfile;;
            $ctrl=new $ctrlClass;
            $ctrl->$action();
        }else{
            throw new \Exception('找不到控制器'.$ctrlClass);
        }
    }

④模型類:通過它連接

<?php
namespace core\lib;
//use \core\lib\model;
use core\lib\conf;
class model extends \PDO
{
    public function __construct()
    {
        //連接數據庫
        $dsn='mysql:host=127.0.0.1;dbname=jiance';
        $username='root';
        $passwd='root';
        $database=conf::all('database');
        try{
            parent::__construct($database['DSN'], $database['USERNAME'], $database['PASSWD']);
        } catch(\PDOException $e){
            p($e->getMessage());
        }
    }
}

?>
⑤視圖層,通過控制器爲它賦值展示數據

 public function assign($name,$value)
    {
        $this->assign[$name]=$value;
    }
    public function display($file)
    {
        $file=APP.'/views/'.$file;
        if(is_file($file)){
            //p($this->assign);exit();
            extract($this->assign);
            include $file;
        };
    }


這樣一個簡陋的MVC就完成了










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章