Zend Framework+smarty用法實(shí)例詳解
本文實(shí)例講述了Zend Framework+smarty用法。分享給大家供大家參考,具體如下:
一、Zend Framework簡(jiǎn)介
Zend Framework使用模型-視圖-控制器(Model-View-Controller(MVC))結(jié)構(gòu)。這個(gè)用來(lái)把你的程序分離成不同部分使得開(kāi)發(fā)和維護(hù)變得容易。
運(yùn)行Zend Framework需要:PHP 5.1.4 (或更高) 、Web 服務(wù)器支持 mod_rewrite功能,本實(shí)例采用Apache。 從這里http://framework.zend.com/download下載 Zend Framework,有兩種格式.zip或者.tar.gz。
二、Zend Framework的配置
1、目錄結(jié)構(gòu)
雖然Zend Framework 沒(méi)有強(qiáng)求使用一個(gè)標(biāo)準(zhǔn)的目錄結(jié)構(gòu),但是還是有一些通用的目錄結(jié)構(gòu)。這個(gè)目錄結(jié)構(gòu)假設(shè)你完全控制Apache 的配置。(下面以本機(jī)做例子,各位需根據(jù)自己的情況進(jìn)行更改,我的服務(wù)器的根目錄指向的是Web文件夾)
引用:
Web/
test/
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/css
我們已經(jīng)把程序中的模型、視圖和控制器的文件分離到不同的子目錄中。支持的圖像,腳本和CSS 文件被存放在webroot 目錄下的不同子目錄中。下載的Zend Framework 文件放在 library 目錄下。如果我們還需要其他庫(kù)文件,都可以放在這里。在這個(gè)實(shí)例中,我們使用到了Smarty模版技術(shù),所以Smarty 的庫(kù)文件我們也應(yīng)該放在library文件下!
2、啟動(dòng)文件
1) 配置.htaccess
我們使用單一的入口文件index.php來(lái)對(duì)我們的程序進(jìn)行訪問(wèn),這給我們提供了程序中所有頁(yè)面的中心點(diǎn)并確保運(yùn)行環(huán)境配置正確。我們用.htaccess 文件來(lái)實(shí)現(xiàn)這個(gè)目的,添加.htaccess 文件在test 的根目錄中,內(nèi)容如下:
RewriteEngine on RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php
2)配置Apache
與此同時(shí),我們還需要對(duì)apache進(jìn)行一些設(shè)置,打開(kāi)apache的配置文件 httpd.conf。
1、找到“#LoadModule rewrite_module modules/mod_rewrite.so 這句話,把前面的#去掉!
2、然后再找到“AllowOverride None 改成AllowOverride All,重新啟動(dòng)apache即可。
3、啟動(dòng)文件index.php
index.php放在test的根目錄下,下面是index.php的內(nèi)容::
<?php
//打開(kāi)錯(cuò)誤提示
error_reporting(E_ALL|E_STRICT);
//設(shè)定時(shí)區(qū)
date_default_timezone_set('Asia/Shanghai');
//指明引用文件的路徑
set_include_path('.' .
PATH_SEPARATOR . './library/'.
PATH_SEPARATOR . './webapp/models/'.
PATH_SEPARATOR . get_include_path());
//必須手動(dòng)加載Loader.php
include "Zend/Loader.php";
//自動(dòng)加載類(lèi),使用時(shí),直接實(shí)例化使用
function __autoload($class){
Zend_Loader::loadClass($class);
}
//getInstance()方法用來(lái)獲取前端控制器實(shí)例
$frontController = Zend_Controller_Front::getInstance();
//設(shè)定前端路由器的工作目錄
$frontController->setControllerDirectory(array("default"=>'./webapp/controllers'));
//拋出異常
$frontController->throwExceptions(true);
//設(shè)置基地址,方便以后url的跳轉(zhuǎn)用戶(hù),.注意,區(qū)分大小寫(xiě)!
$frontController->setBaseUrl('/test');
//使用smarty模版需關(guān)閉本身的視圖助手.
$frontController->setParam('noViewRenderer', true);
// 關(guān)閉錯(cuò)誤提示,發(fā)生請(qǐng)求錯(cuò)誤時(shí)候,轉(zhuǎn)到ErrorController的errorAction控制器
//$frontController->throwExceptions(false);
//對(duì)。。進(jìn)行注冊(cè)
Zend_Registry::set('font', $frontController);
//------------配置Smarty模版 ----------------
include 'Smarty/Smarty.class.php';
/**
* 對(duì)smarty模版進(jìn)行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = './webapp/templates_c';
$views->cache_dir = './webapp/templates_c/cache_c';
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block('dynamic','smarty_block_dynamic',false);
Zend_Registry::set('views', $views);
//開(kāi)始運(yùn)行程序
$frontController->dispatch();
?>
4)啟動(dòng)文件說(shuō)明
Zend Framework 是這樣設(shè)計(jì)的,所有的文件必須包含在 include_path 中。我們也把我們的模型目錄包含在 include path 中,這樣我們以后就能很容易加載我們的模型類(lèi)。一開(kāi)始,我們必須 include Zend/Loader.php,這樣我們就能訪問(wèn)Zend_Loader 類(lèi),在Zend_Loader 類(lèi)中有靜態(tài)方法使我們能夠加載其他Zend Framework 類(lèi),例如:
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass 加載已經(jīng)命名的類(lèi)。它是把下劃線轉(zhuǎn)換成路徑隔離符來(lái)實(shí)現(xiàn)的,并在最后加上.php 后綴。這樣,類(lèi)Zend_Controller_Front 將從Zend/Controller/font.php 加載。如果你在你的類(lèi)庫(kù)里使用相同的命名規(guī)則,就可以用Zend_Loader::loadCass()來(lái)加載它們。我們需要加載控制器類(lèi)和路由類(lèi)。
前端控制器用路由類(lèi)來(lái)映射請(qǐng)求的 URL 到正確的 PHP 函數(shù),然后顯示頁(yè)面。為了能使路由工作,需要解決 URL 的哪一部分是指向index.php 的路徑,這樣它就可以在那個(gè)點(diǎn)后面尋找url 元素。
我們需要配置前端路由器,這樣它就知道從哪個(gè)目錄里找出我們的控制器。
$frontController = Zend_Controller_Front::getInstance();
$frontController->setControllerDirectory('./application/controllers');
設(shè)置拋出異常,但是在服務(wù)器真正工作以后,我們不應(yīng)該顯示錯(cuò)誤信息給用戶(hù)看。
$frontController->throwExceptions(true);
由于在本實(shí)例中我們使用Smarty模版技術(shù)。所以我們關(guān)閉ZF本身自帶的view。$frontController->setParam('noViewRenderer', true);設(shè)置基地址,方便以后設(shè)置url來(lái)進(jìn)行跳轉(zhuǎn)。$frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);接下來(lái),我們對(duì)Smarty進(jìn)行設(shè)置。首先我們?cè)陬?lèi)庫(kù)中引用了Smarty.class.php這個(gè)類(lèi)。并且對(duì)它的路徑進(jìn)行了設(shè)置,以便讓ZF知道它的位置。:
include 'Smarty/Smarty.class.php';
/**
* 對(duì)smarty模版進(jìn)行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = './webapp/templates_c';
$views->cache_dir = './webapp/templates_c/cache_c';
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block('dynamic','smarty_block_dynamic',false);
在這里,我們用ZF的對(duì)象注冊(cè)表(Registry)來(lái)對(duì)$view來(lái)進(jìn)行存貯,這樣,在程序的任何對(duì)方,我們都可以調(diào)用它來(lái)進(jìn)行操作。Zend_Registry::set('views', $views);設(shè)置好了以后,運(yùn)行程序。$frontController->dispatch();
這個(gè)時(shí)候,你如果運(yùn)行http://127.0.0.1/test 來(lái)進(jìn)行測(cè)試。會(huì)發(fā)現(xiàn)有個(gè)錯(cuò)誤類(lèi)似 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in…這個(gè)是因?yàn)槲覀冞€沒(méi)有設(shè)置好我們程序。
3、設(shè)置程序
在設(shè)置文件以前,理解Zend Framework 如何組織頁(yè)面很重要。每個(gè)應(yīng)用程序的頁(yè)面叫做 action ,許多 action 組成控制器。例如,對(duì)于這樣一個(gè)格式的 URL http://localhost/test/news/view/id/1 來(lái)說(shuō),控制器是news, action 是view,后面的id和1,分別是往這個(gè)actionView傳遞的參數(shù)和值。
Zend Framework 控制器把 index 作為一個(gè)缺省的action 而保留為特別的action。這樣,對(duì)于http://localhost/test/news/ 這樣的url,在news控制器里的 index action將被執(zhí)行。Zend Framework 也保留了一個(gè)缺省的控制器,也叫做index。這樣,http://localhost/test/ 將執(zhí)行 index控制器下的 action index。
4、設(shè)置控制器
現(xiàn)在可以設(shè)置控制器了。在Zend Framework 里,控制器是一個(gè)必需被叫做{Controller name}Controller 的類(lèi)。注意{Controller name}必需以大寫(xiě)字母開(kāi)頭。并且,這個(gè)類(lèi)必須在叫做{Controller name}Controller.php這樣的文件中,這個(gè)文件還必需在特定的控制器目錄中。強(qiáng)調(diào)一下,{Controller name}必需以大寫(xiě)字母開(kāi)頭并其他字母一定是小寫(xiě)。每個(gè)action是在控制器類(lèi)里的public 函數(shù),名字必需是{action name}Action。在這里,{action name}應(yīng)該以小寫(xiě)字母開(kāi)頭。這樣在文件 test/webapp/controllers/IndexController.php 里我們的控制器類(lèi)叫做 IndexController,位置:test/webapp/controllers/IndexController.php:
<?php
class IndexController extends Zend_Controller_Action
{
function init()
{
}
function indexAction()
{
}
function addAction()
{
}
}
?>
我們現(xiàn)在有三個(gè)我們想使用的action,直到我們?cè)O(shè)置好視圖,它們才工作。其中function init是個(gè)特殊的函數(shù),簡(jiǎn)單的說(shuō),它就是在controller中的構(gòu)造函數(shù)時(shí)調(diào)用的函數(shù)。
每個(gè)action的 URL 如下:
http://localhost/test/ in IndexController::indexAction()
http://localhost/test/index/add in IndexController::addAction()
現(xiàn)在,我們?cè)诔绦蚶镉袀€(gè)能工作的路由器和每個(gè)頁(yè)面的 action。
5、設(shè)置視圖
因?yàn)楸緦?shí)例使用的的是Smarty模版,所以和ZF本身的View視圖在實(shí)現(xiàn)過(guò)程中,稍微有點(diǎn)區(qū)別!下面我直接介紹在ZF里是任何使用Smarty的。在使用Smarty之前,我們應(yīng)該先取出在index.php里定義的$view,并且定義好,需要在模版顯示的變量。:
class IndexController extends Zend_Controller_Action
{
var $views; /*模板對(duì)象*/
var $data; /*傳遞模版變量的對(duì)象*/
function init()
{
//拿回注冊(cè)過(guò)的對(duì)象
$this->views = Zend_Registry::get('views');
}
function indexAction()
{
//定義模版顯示的變量
$data[`title′]=〞hello world〞;
//傳遞變量到模版
$this->views->assign($data);
//顯示模版
$this->views->display('index/index.tpl');
}
function addAction()
{
}
}
下面我們開(kāi)始做視圖文件,它們的位置是test/webapp/templates/index/index.tpl:
代碼:
{$title}
這個(gè)時(shí)候,輸入http://127.0.0.1/test看看。應(yīng)該會(huì)出現(xiàn)“hello world 了。
這樣,一個(gè)簡(jiǎn)單的實(shí)例就完成了。下面我們結(jié)合Xmlrpc技術(shù)來(lái)實(shí)現(xiàn)一個(gè)稍微復(fù)雜一點(diǎn)的實(shí)例!
三、XMLRPC
1、什么是XMLRPC
XMLRPC,顧名思義,就是應(yīng)用了XML技術(shù)的RPC。那么什么是XML和RPC了?
RPC是Remote Procedure Call的縮寫(xiě),翻譯成中文就是遠(yuǎn)程過(guò)程調(diào)用,是一種在本地的機(jī)器上調(diào)用遠(yuǎn)端機(jī)器上的一個(gè)過(guò)程(方法)的技術(shù),這個(gè)過(guò)程也被大家稱(chēng)為“分布式計(jì)算 ,是為了提高各個(gè)分立機(jī)器的“互操作性 而發(fā)明出來(lái)的技術(shù)。
XML和RPC一樣也是一個(gè)東西的縮寫(xiě),這個(gè)東西就是eXtensible Markup Language,中文意思就是可擴(kuò)展標(biāo)記語(yǔ)言,標(biāo)記語(yǔ)言就是那種用尖括號(hào)(<>)括來(lái)括去的那種語(yǔ)言,比如說(shuō)HTML。XML的可擴(kuò)展性也體現(xiàn)在它只定義了語(yǔ)言的格式,而并沒(méi)有定義過(guò)多的關(guān)鍵字,也就是通常所說(shuō)的標(biāo)記(Tag),所以用戶(hù)可以自由地選擇定義標(biāo)記。它的這種自由和簡(jiǎn)單的語(yǔ)法規(guī)則也使得它廣為流傳,用來(lái)表示各種數(shù)據(jù)。
2、在ZF中使用XMLRPC
1)創(chuàng)建IndexController.php
下面我們來(lái)完成一個(gè)實(shí)例,為了方便起見(jiàn),就不建立新的Controller,把剛才我們建立的IndexController修改一下,就能使用了!另外我們還需要建立一個(gè)XMLRPC的服務(wù)端程序。位置在WEB服務(wù)器的根目錄上(在本機(jī)中,也就是在test文件的上級(jí)目錄中,取名為1.php),由于XMLRPC使用到了類(lèi)庫(kù),我們還需要下載libphpxmlrpc放在library文件夾下!
文件位置:test/webapp/controller/IndexController.php:
class IndexController extends Zend_Controller_Action
{
var $views; /*模板對(duì)象*/
var $data; /*傳遞模版變量的對(duì)象*/
public function init()
{
//拿回注冊(cè)過(guò)的對(duì)象
$this->views = Zend_Registry::get('views');
$this->font = Zend_Registry::get('font');
//得到基地址
$this->baseurl=$this->font->getBaseUrl();
}
function indexAction()
{
@include "libphpxmlrpc/xmlrpc.inc";
@include "libphpxmlrpc/xmlrpcs.inc";
if (isset($_POST['var1']) && isset($_POST['var2']))
{
//創(chuàng)建客戶(hù)端
$client = new xmlrpc_client('http://127.0.0.1/1.php');
//創(chuàng)建一個(gè)實(shí)例
@ $msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST['var1'], "int"),
new xmlrpcval($_POST['var2'], "int")));
//發(fā)送信息,
$response=$client->send($xmlrpc_message);,服務(wù)器返回xmlrpcresp的一個(gè)實(shí)例
$retval = $client->send($msg);
if ($retval->faultCode())
{
print_r("發(fā)生一個(gè)錯(cuò)誤: ");
print_r("原因: " . htmlspecialchars($retval->faultString()));
}
else
{
//$retval->value()獲取應(yīng)答的xmlrpcval(也就是服務(wù)器端返回的結(jié)果),
$retval->value()->scalarval();得到描述應(yīng)答結(jié)果的PHP變量
$sum = $retval->value()->scalarval();
}
}
@$data['var1']=$_POST['var1'];
@$data['var2']=$_POST['var2'];
@$data['sum']=$sum;
@$data[`action′]= "$this->baseurl/index/";
//構(gòu)造完整的url給模版
$time=date("Y-m-d H:i:s")
@$data['url']="$this->baseurl/index/add/id/$sum/time/$time";
/傳遞變量到模版
$this->views->assign($data);
//顯示模版
$this->views->display('index/index.tpl');
}
function addAction()
{
$data['title']="實(shí)驗(yàn)一下";
//得到傳遞的值
$id=$this->_request->getParam("id");
$time=$this->_request->getParam("time");
$data['id']="$id";
$data['time']="$time";
$this->views->assign($data);
$this->views->display('index/add.tpl');
}
}
2)創(chuàng)建顯示模版文件
位置:test/webapp/templates/index/index.tpl:
hello,下面演示的是利用Xmlrpc調(diào)用遠(yuǎn)程服務(wù)器方法的實(shí)例!并且我們把得到的結(jié)果傳遞到另外的一個(gè)函數(shù)中去!
代碼:
{if $sum}
點(diǎn)一下看看!
{/if}
位置: test/webapp/templates/index/add.tpl:
現(xiàn)在是{$time}
{$title}你剛才傳遞的是 {$id}
3)創(chuàng)建XMLRPC服務(wù)器端程序
位置:web/1.php:
<?php
@include ("libphpxmlrpc/xmlrpc.inc");
@include ("libphpxmlrpc/xmlrpcs.inc");
if ($_SERVER['REQUEST_METHOD'] != 'POST')
{
exit(0);
}
$add_sig = array(array($xmlrpcString, $xmlrpcInt, $xmlrpcInt));
$add_doc = "Add the two integer together";
function add($params)
{
//引入用戶(hù)錯(cuò)誤代碼值
global $xmlrpcerruser;
//返回一個(gè)PHP數(shù)組
$val = php_xmlrpc_decode($params);
$ret = $val[0] + $val[1];
return new xmlrpcresp(new xmlrpcval($ret, "int"));
}
//創(chuàng)建一個(gè)xmlrpc_server的實(shí)例:
$server = new xmlrpc_server(array(
"add" => array(
"function" => "add",
"signature" => $add_sig,
"docstring" => $add_doc
)));
?>
OK,現(xiàn)在打開(kāi)http;//127.0.0.1/test/看看。剛才建立的那個(gè)XMLRPC應(yīng)該已經(jīng)建立起來(lái)了,輸入數(shù)字,測(cè)試一下吧!
更多關(guān)于zend相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Zend FrameWork框架入門(mén)教程》、《php優(yōu)秀開(kāi)發(fā)框架總結(jié)》、《Yii框架入門(mén)及常用技巧總結(jié)》、《ThinkPHP入門(mén)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家基于zend framework框架的PHP程序設(shè)計(jì)有所幫助。
- windows下zendframework項(xiàng)目環(huán)境搭建(通過(guò)命令行配置)
- Zend Framework數(shù)據(jù)庫(kù)操作技巧總結(jié)
- Zend Framework數(shù)據(jù)庫(kù)操作方法實(shí)例總結(jié)
- Zend Framework入門(mén)應(yīng)用實(shí)例詳解
- Zend Framework入門(mén)教程之Zend_View組件用法示例
- Zend Framework開(kāi)發(fā)入門(mén)經(jīng)典教程
- 解析zend Framework如何自動(dòng)加載類(lèi)
- Zend Framework頁(yè)面緩存實(shí)例
- Zend Framework 2.0事件管理器(The EventManager)入門(mén)教程
- Zend Framework入門(mén)知識(shí)點(diǎn)小結(jié)
- Zend Framework緩存Cache用法簡(jiǎn)單實(shí)例
- Zend?Framework基于Command命令行建立Zend?Framework項(xiàng)目的方法
相關(guān)文章
PHP中幾個(gè)可以提高運(yùn)行效率的代碼寫(xiě)法、技巧分享
這篇文章主要介紹了PHP中幾個(gè)可以提高運(yùn)行效率的代碼寫(xiě)法、技巧分享,本文分享的5個(gè)方法都是在細(xì)微之處有所不同,一定要認(rèn)真仔細(xì)的去看代碼哦,需要的朋友可以參考下2014-08-08
OAuth認(rèn)證協(xié)議中的HMACSHA1加密算法(實(shí)例)
下面小編就為大家?guī)?lái)一篇OAuth認(rèn)證協(xié)議中的HMACSHA1加密算法(實(shí)例)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
解決Laravel 不能創(chuàng)建 migration 的問(wèn)題
今天小編就為大家分享一篇解決Laravel 不能創(chuàng)建 migration 的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
常見(jiàn)的5個(gè)PHP編碼小陋習(xí)以及優(yōu)化實(shí)例講解
這篇文章主要介紹了常見(jiàn)的5個(gè)PHP編碼小陋習(xí)實(shí)例講解,講解了常見(jiàn)寫(xiě)法和優(yōu)化方法,看一下是否自己也是這樣寫(xiě)的呢2021-02-02
thinkphp 3.2框架視圖模型 實(shí)例視圖查詢(xún)結(jié)果的二維數(shù)組合并操作示例
這篇文章主要介紹了thinkphp 3.2框架視圖模型 實(shí)例視圖查詢(xún)結(jié)果的二維數(shù)組合并操作,結(jié)合實(shí)例形式分析了thinkPHP3.2針對(duì)視圖查詢(xún)結(jié)果的數(shù)組合并相關(guān)操作技巧,需要的朋友可以參考下2020-03-03
php實(shí)現(xiàn)QQ小程序發(fā)送模板消息功能
QQ小程序群里有伙伴要發(fā)送模板消息的代碼,所以今天給大家分享QQ小程序模板消息發(fā)布,絕對(duì)一步一步帶著大家走,每個(gè)細(xì)節(jié)都講到,感興趣的朋友跟隨小編一起看看吧2019-09-09
使用PHP連接數(shù)據(jù)庫(kù)_實(shí)現(xiàn)用戶(hù)數(shù)據(jù)的增刪改查的整體操作示例
下面小編就為大家?guī)?lái)一篇使用PHP連接數(shù)據(jù)庫(kù)_實(shí)現(xiàn)用戶(hù)數(shù)據(jù)的增刪改查的整體操作示例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
PHP在線生成二維碼(google api)的實(shí)現(xiàn)代碼詳解
本篇文章是對(duì)PHP在線生成二維碼(google api)的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

