从零开始打造自己的PHP框架――第2章

目标

本篇,我们来实现加载控制器、数据查询和页面渲染。

加载控制器

控制器

在app目录下,新建ctrl目录,ctrl目录下新建indexCtrl.php文件,内容如下:

<?php
namespace app\ctrl;

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

调用控制器

在根目录下的index.php文件中,继续添加:

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

数据查询

1、在mysql中,新建数据库vkphp。

2、在vkphp数据库中,新建表vk_user,字段包括id、username和password。

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

4、在indexCtrl.php中,添加:

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。

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 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命名空间中的元素使用同样的原理。例如,类名可以通过三种方式引用:

1、非限定名称,或不包含前缀的类名称,例如 $a=new foo();foo::staticmethod(); 。如果当前命名空间是 currentnamespace,foo 将被解析为 \currentnamespace\foo ;如果当前没有指定命名空间,则foo会被解析为 \foo
2、限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo();subnamespace\foo::staticmethod(); 。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 \currentnamespace\subnamespace\foo ;如果当前没有指定命名空间,foo 会被解析为\subnamespace\foo
3、完全限定名称,或包含了全局前缀操作符的名称,例如,$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

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 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/vkphp/releases/tag/v1.2.0

书签

从零开始打造自己的PHP框架

使用命名空间:基础

使用命名空间:后备全局函数/常量

smarty基础安装

smarty进阶安装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容