從零開始打造自己的PHP框架――第2章

voidking發表於2019-02-16

目標

本篇,我們來實現載入控制器、資料查詢和頁面渲染。

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

載入控制器

控制器

在app目錄下,新建ctrl目錄,ctrl目錄下新建indexCtrl.php檔案,內容如下:

<?php
namespace appctrl;

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

呼叫控制器

在根目錄下的index.php檔案中,繼續新增:

include CORE.`/autoload.php`;
spl_autoload_register(`coreautoload::load`);
$route = new core
oute();

$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”。

資料查詢

1、在mysql中,新建資料庫vkphp。

2、在vkphp資料庫中,新建表vk_user,欄位包括id、username和password。

3、在common資料夾下,新建db.php,內容如下:

<?php
namespace corecommon;

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();
        }
    }
}

4、在indexCtrl.php中,新增:

public function data(){
    $db = new corecommondb();
    $sql = `select * from vk_user`;
    $result = $db->query($sql);
    p($result);
    p($result->fetchAll());
}

訪問地址 http://vkphp.dev/index/data ,即可看到從資料庫中查詢出的資料。

頁面渲染

頁面渲染,主要有兩部分工作:賦值和顯示。我們需要實現兩個函式:assign和display。

1、在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>

2、在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;
        }
    }
}

3、修改indexCtrl.php如下:

<?php
namespace appctrl;

class indexCtrl extends core
ender{
    // 其他

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

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

頁面渲染進階

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

名稱空間

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

首先宣告:名稱空間和檔案路徑沒有關係,沒有關係,沒有關係!雖然,在使用名稱空間時經常參考檔案路徑,但是,它們沒有必然關係。

名稱空間的作用:解決重名問題。不同的名稱空間中,可以存在相同類名和函式名。我們在使用一個類和函式時,必須明確指出使用的是哪一個名稱空間中的類和函式。

上文我們說到,在檔案系統中訪問一個檔案有三種方式,PHP名稱空間中的元素使用同樣的原理。例如,類名可以通過三種方式引用:

1、非限定名稱,或不包含字首的類名稱,例如 $a=new foo();foo::staticmethod(); 。如果當前名稱空間是 currentnamespace,foo 將被解析為 currentnamespacefoo ;如果當前沒有指定名稱空間,則foo會被解析為 foo
2、限定名稱,或包含字首的名稱,例如 $a = new subnamespacefoo();subnamespacefoo::staticmethod(); 。如果當前的名稱空間是 currentnamespace,則 foo 會被解析為 currentnamespacesubnamespacefoo ;如果當前沒有指定名稱空間,foo 會被解析為subnamespacefoo
3、完全限定名稱,或包含了全域性字首操作符的名稱,例如,$a = new currentnamespacefoo();currentnamespacefoo::staticmethod();。在這種情況下,foo 總是被解析為程式碼中的文字名(literal name) currentnamespacefoo

下面舉個例子:

<?php
namespace ABC;
class Exception extends Exception {}

$a = new Exception(`hi`); // $a 是類 ABCException 的一個物件
$b = new Exception(`hi`); // $b 是類 Exception 的一個物件

$c = new ArrayObject; // 致命錯誤, 找不到 ABCArrayObject 類
?>

下載安裝smarty

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

2、在根目錄下新建lib,解壓smarty到lib目錄下,重新命名資料夾為smarty。

使用smarty

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

2、在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>

3、修改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;
        }
    }
}

4、修改indexCtrl.php如下:

<?php
namespace appctrl;
include CORE.`/render.php`;

class indexCtrl extends 
ender{
    // 其他

    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進階安裝

相關文章