目標
本篇,我們來實現載入控制器、資料查詢和頁面渲染。
原文地址: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…