從零開始打造本身的PHP框架――第2章

目標

本篇,咱們來實現加載控制器、數據查詢和頁面渲染。php

原文地址:http://www.voidking.com/2017/...html

加載控制器

控制器

在app目錄下,新建ctrl目錄,ctrl目錄下新建indexCtrl.php文件,內容以下:mysql

<?php
namespace app\ctrl;

class indexCtrl{
    public function index(){
        echo 'index ctrl';
    }
}

調用控制器

在根目錄下的index.php文件中,繼續添加:git

include CORE.'/autoload.php';
spl_autoload_register('\core\autoload::load');
$route = new \core\route();

$ctrl = $route->ctrl;
$action = $route->action;
$params = $route->params;
$ctrl_file = APP.'/ctrl/'.$ctrl.'Ctrl.php';
$ctrl_class = '\\app\\ctrl\\'.$ctrl.'Ctrl';
if(is_file($ctrl_file)){
    include $ctrl_file;
    $ctrl_obj = new $ctrl_class;
    $ctrl_obj->$action();
}else {
    throw new \Exception('找不到控制器'.$ctrl_file);
}

訪問地址 http://vkphp.dev ,便可看到「index ctrl」。github

數據查詢

一、在mysql中,新建數據庫vkphp。sql

二、在vkphp數據庫中,新建表vk_user,字段包括id、username和password。數據庫

三、在common文件夾下,新建db.php,內容以下:數組

<?php
namespace core\common;

class db extends \PDO{
    public function __construct(){
        $dsn = 'mysql:host=localhost;dbname=vkphp';
        $username = 'root';
        $passwd = '';
        try{
            parent::__construct($dsn,$username,$passwd);
            // echo 'database connect success';
        }catch (\Exception $e){
            echo $e->getMessage();
        }
    }
}

四、在indexCtrl.php中,添加:app

public function data(){
    $db = new \core\common\db();
    $sql = 'select * from vk_user';
    $result = $db->query($sql);
    p($result);
    p($result->fetchAll());
}

訪問地址 http://vkphp.dev/index/data ,便可看到從數據庫中查詢出的數據。框架

頁面渲染

頁面渲染,主要有兩部分工做:賦值和顯示。咱們須要實現兩個函數:assign和display。

一、在app目錄下新建view目錄,view目錄下新建index目錄,index目錄中新建render.html,內容以下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Render</title>
</head>
<body>
    <p>第一個視圖</p>
    <p>用戶名:<?php echo $username; ?></p>
</body>
</html>

二、在core目錄中,添加render.php,內容以下:

<?php
namespace core;

class render{
    public $params = array();
    public function assign($name,$value){
        $this->params[$name] = $value;
    }

    public function display($file){
        $file = APP.'/view/'.$file;
        if(is_file($file)){
            extract($this->params); //把數組變成變量
            include $file;
        }
    }
}

三、修改indexCtrl.php以下:

<?php
namespace app\ctrl;

class indexCtrl extends \core\render{
    // 其餘

    public function render(){
        $this->assign('username','voidking');
        $this->display('index/render.html');
    }
}

訪問地址 http://vkphp.dev/index/render ,便可看到渲染出的頁面。

頁面渲染進階

直接在頁面echo,難以體現水平,咱們來安裝一個模板引擎――smarty。

命名空間

接下來smarty的使用,牽涉到命名空間這個知識點,在此學習一下。

首先聲明:命名空間和文件路徑沒有關係,沒有關係,沒有關係!雖然,在使用命名空間時常常參考文件路徑,可是,它們沒有必然關係。

命名空間的做用:解決重名問題。不一樣的命名空間中,能夠存在相同類名和函數名。咱們在使用一個類和函數時,必須明確指出使用的是哪個命名空間中的類和函數。

上文咱們說到,在文件系統中訪問一個文件有三種方式,PHP命名空間中的元素使用一樣的原理。例如,類名能夠經過三種方式引用:

一、非限定名稱,或不包含前綴的類名稱,例如 $a=new foo();foo::staticmethod(); 。若是當前命名空間是 currentnamespace,foo 將被解析爲 \currentnamespace\foo ;若是當前沒有指定命名空間,則foo會被解析爲 \foo
二、限定名稱,或包含前綴的名稱,例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod(); 。若是當前的命名空間是 currentnamespace,則 foo 會被解析爲 \currentnamespace\subnamespace\foo ;若是當前沒有指定命名空間,foo 會被解析爲\subnamespace\foo
三、徹底限定名稱,或包含了全局前綴操做符的名稱,例如,$a = new \currentnamespace\foo();\currentnamespace\foo::staticmethod();。在這種狀況下,foo 老是被解析爲代碼中的文字名(literal name) \currentnamespace\foo

下面舉個栗子:

<?php
namespace A\B\C;
class Exception extends \Exception {}

$a = new Exception('hi'); // $a 是類 A\B\C\Exception 的一個對象
$b = new \Exception('hi'); // $b 是類 Exception 的一個對象

$c = new ArrayObject; // 致命錯誤, 找不到 A\B\C\ArrayObject 類
?>

下載安裝smarty

一、訪問smarty官方下載 ,下載smarty,小編下載的是3.1.30版本。

二、在根目錄下新建lib,解壓smarty到lib目錄下,重命名文件夾爲smarty。

使用smarty

一、在app目錄下新建smarty目錄,smarty目錄下新建templates、template_c、configs、cache四個目錄。

二、在templates目錄下新建index目錄,index目錄中新建render2.html,內容以下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Smarty</title>
</head>
<body>
    <p>第一個Smarty頁面</p>
    <p>用戶名:{{$username}}</p>
</body>
</html>

三、修改core目錄下的render.php以下:

<?php

namespace core;

class render{   
    public $smarty;
    public function __construct(){

        require_once(LIB.'/smarty/libs/Smarty.class.php');
        $this->smarty = new \Smarty();

        $this->smarty->setTemplateDir(APP.'/smarty/templates/');
        $this->smarty->setCompileDir(APP.'/smarty/templates_c/');
        $this->smarty->setConfigDir(APP.'/smarty/configs/');
        $this->smarty->setCacheDir(APP.'/smarty/cache/');
    }

    public $params = array();
    public function assign($name,$value){
        $this->params[$name] = $value;
    }

    public function display($file){
        $file = APP.'/view/'.$file;
        if(is_file($file)){
            extract($this->params); //把數組變成變量
            include $file;
        }
    }
}

四、修改indexCtrl.php以下:

<?php
namespace app\ctrl;
include CORE.'/render.php';

class indexCtrl extends \render{
    // 其餘

    public function render2(){
        $this->smarty->assign('username','voidking');
        $this->smarty->display('index/render2.html');
    }
}

訪問地址 http://vkphp.dev/index/render2 ,便可看到渲染出的頁面。

源碼分享

https://github.com/voidking/v...

書籤

從零開始打造本身的PHP框架

使用命名空間:基礎

使用命名空間:後備全局函數/常量

smarty基礎安裝

smarty進階安裝

相關文章
相關標籤/搜索