《PHP編程:Zend Framework+smarty用法實(shí)例詳解》要點(diǎn):
本文介紹了PHP編程:Zend Framework+smarty用法實(shí)例詳解,希望對您有用。如果有疑問,可以聯(lián)系我們。
本文實(shí)例講述了Zend Framework+smarty用法.分享給大家供大家參考,具體如下:PHP實(shí)例
一、Zend Framework簡介PHP實(shí)例
Zend Framework使用模型-視圖-控制器(Model-View-Controller(MVC))結(jié)構(gòu).這個(gè)用來把你的程序分離成不同部分使得開發(fā)和維護(hù)變得容易.PHP實(shí)例
運(yùn)行Zend Framework需要:PHP 5.1.4 (或更高) 、Web 服務(wù)器支持 mod_rewrite功能,本實(shí)例采用Apache. 從這里http://framework.zend.com/download下載 Zend Framework,有兩種格式.zip或者.tar.gz.PHP實(shí)例
二、Zend Framework的配置PHP實(shí)例
1、目錄結(jié)構(gòu)PHP實(shí)例
雖然Zend Framework 沒有強(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文件夾)PHP實(shí)例
引用:PHP實(shí)例
Web/
test/
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/cssPHP實(shí)例
我們已經(jīng)把程序中的模型、視圖和控制器的文件分離到不同的子目錄中.支持的圖像,腳本和CSS 文件被存放在webroot 目錄下的不同子目錄中.下載的Zend Framework 文件放在 library 目錄下.如果我們還需要其他庫文件,都可以放在這里.在這個(gè)實(shí)例中,我們使用到了Smarty模版技術(shù),所以Smarty 的庫文件我們也應(yīng)該放在library文件下!PHP實(shí)例
2、啟動(dòng)文件PHP實(shí)例
1) 配置.htaccessPHP實(shí)例
我們使用單一的入口文件index.php來對我們的程序進(jìn)行拜訪,這給我們提供了程序中所有頁面的中心點(diǎn)并確保運(yùn)行環(huán)境配置正確.我們用.htaccess 文件來實(shí)現(xiàn)這個(gè)目的,添加.htaccess 文件在test 的根目錄中,內(nèi)容如下:PHP實(shí)例
RewriteEngine on RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php
2)配置Apache
與此同時(shí),我們還需要對apache進(jìn)行一些設(shè)置,打開apache的配置文件 httpd.conf.PHP實(shí)例
1、找到“#LoadModule rewrite_module modules/mod_rewrite.so 這句話,把前面的#去掉!PHP實(shí)例
2、然后再找到“AllowOverride None 改成AllowOverride All,重新啟動(dòng)apache即可.PHP實(shí)例
3、啟動(dòng)文件index.php
index.php放在test的根目錄下,下面是index.php的內(nèi)容::PHP實(shí)例
<?php //打開錯(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)加載類,使用時(shí),直接實(shí)例化使用 function __autoload($class){ Zend_Loader::loadClass($class); } //getInstance()方法用來獲取前端控制器實(shí)例 $frontController = Zend_Controller_Front::getInstance(); //設(shè)定前端路由器的工作目錄 $frontController->setControllerDirectory(array("default"=>'./webapp/controllers')); //拋出異常 $frontController->throwExceptions(true); //設(shè)置基地址,方便以后url的跳轉(zhuǎn)用戶,.注意,區(qū)分大小寫! $frontController->setBaseUrl('/test'); //使用smarty模版需關(guān)閉本身的視圖助手. $frontController->setParam('noViewRenderer', true); // 關(guān)閉錯(cuò)誤提示,發(fā)生哀求錯(cuò)誤時(shí)候,轉(zhuǎn)到ErrorController的errorAction控制器 //$frontController->throwExceptions(false); //對..進(jìn)行注冊 Zend_Registry::set('font', $frontController); //------------配置Smarty模版 ---------------- include 'Smarty/Smarty.class.php'; /** * 對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); //開始運(yùn)行程序 $frontController->dispatch(); ?>
4)啟動(dòng)文件說明PHP實(shí)例
Zend Framework 是這樣設(shè)計(jì)的,所有的文件必須包含在 include_path 中.我們也把我們的模型目錄包含在 include path 中,這樣我們以后就能很容易加載我們的模型類.一開始,我們必須 include Zend/Loader.php,這樣我們就能拜訪Zend_Loader 類,在Zend_Loader 類中有靜態(tài)方法使我們能夠加載其他Zend Framework 類,例如:PHP實(shí)例
Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass 加載已經(jīng)命名的類.它是把下劃線轉(zhuǎn)換成路徑隔離符來實(shí)現(xiàn)的,并在最后加上.php 后綴.這樣,類Zend_Controller_Front 將從Zend/Controller/font.php 加載.如果你在你的類庫里使用相同的命名規(guī)則,就可以用Zend_Loader::loadCass()來加載它們.我們需要加載控制器類和路由類.PHP實(shí)例
前端控制器用路由類來映射哀求的 URL 到正確的 PHP 函數(shù),然后顯示頁面.為了能使路由工作,需要解決 URL 的哪一部分是指向index.php 的路徑,這樣它就可以在那個(gè)點(diǎn)后面尋找url 元素.PHP實(shí)例
我們需要配置前端路由器,這樣它就知道從哪個(gè)目錄里找出我們的控制器.PHP實(shí)例
$frontController = Zend_Controller_Front::getInstance(); $frontController->setControllerDirectory('./application/controllers');
設(shè)置拋出異常,但是在服務(wù)器真正工作以后,我們不應(yīng)該顯示錯(cuò)誤信息給用戶看.PHP實(shí)例
$frontController->throwExceptions(true);
由于在本實(shí)例中我們使用Smarty模版技術(shù).所以我們關(guān)閉ZF本身自帶的view.$frontController->setParam('noViewRenderer', true);設(shè)置基地址,方便以后設(shè)置url來進(jìn)行跳轉(zhuǎn).$frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);接下來,我們對Smarty進(jìn)行設(shè)置.首先我們在類庫中引用了Smarty.class.php這個(gè)類.并且對它的路徑進(jìn)行了設(shè)置,以便讓ZF知道它的位置.:PHP實(shí)例
include 'Smarty/Smarty.class.php'; /** * 對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的對象注冊表(Registry)來對$view來進(jìn)行存貯,這樣,在程序的任何對方,我們都可以調(diào)用它來進(jìn)行操作.Zend_Registry::set('views', $views);設(shè)置好了以后,運(yùn)行程序.$frontController->dispatch();PHP實(shí)例
這個(gè)時(shí)候,你如果運(yùn)行http://127.0.0.1/test 來進(jìn)行測試.會(huì)發(fā)現(xiàn)有個(gè)錯(cuò)誤類似 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in…這個(gè)是因?yàn)槲覀冞€沒有設(shè)置好我們程序.PHP實(shí)例
3、設(shè)置程序PHP實(shí)例
在設(shè)置文件以前,理解Zend Framework 如何組織頁面很重要.每個(gè)應(yīng)用程序的頁面叫做 action ,許多 action 組成控制器.例如,對于這樣一個(gè)格式的 URL http://localhost/test/news/view/id/1 來說,控制器是news, action 是view,后面的id和1,分別是往這個(gè)actionView傳遞的參數(shù)和值.PHP實(shí)例
Zend Framework 控制器把 index 作為一個(gè)缺省的action 而保留為特別的action.這樣,對于http://localhost/test/news/ 這樣的url,在news控制器里的 index action將被執(zhí)行.Zend Framework 也保留了一個(gè)缺省的控制器,也叫做index.這樣,http://localhost/test/ 將執(zhí)行 index控制器下的 action index.PHP實(shí)例
4、設(shè)置控制器PHP實(shí)例
現(xiàn)在可以設(shè)置控制器了.在Zend Framework 里,控制器是一個(gè)必需被叫做{Controller name}Controller 的類.注意{Controller name}必需以大寫字母開頭.并且,這個(gè)類必須在叫做{Controller name}Controller.php這樣的文件中,這個(gè)文件還必需在特定的控制器目錄中.強(qiáng)調(diào)一下,{Controller name}必需以大寫字母開頭并其他字母一定是小寫.每個(gè)action是在控制器類里的public 函數(shù),名字必需是{action name}Action.在這里,{action name}應(yīng)該以小寫字母開頭.這樣在文件 test/webapp/controllers/IndexController.php 里我們的控制器類叫做 IndexController,位置:test/webapp/controllers/IndexController.php:PHP實(shí)例
<?php class IndexController extends Zend_Controller_Action { function init() { } function indexAction() { } function addAction() { } } ?>
我們現(xiàn)在有三個(gè)我們想使用的action,直到我們設(shè)置好視圖,它們才工作.其中function init是個(gè)特殊的函數(shù),簡單的說,它就是在controller中的構(gòu)造函數(shù)時(shí)調(diào)用的函數(shù).PHP實(shí)例
每個(gè)action的 URL 如下:PHP實(shí)例
http://localhost/test/ in IndexController::indexAction()
http://localhost/test/index/add in IndexController::addAction()PHP實(shí)例
現(xiàn)在,我們在程序里有個(gè)能工作的路由器和每個(gè)頁面的 action.PHP實(shí)例
5、設(shè)置視圖PHP實(shí)例
因?yàn)楸緦?shí)例使用的的是Smarty模版,所以和ZF本身的View視圖在實(shí)現(xiàn)過程中,稍微有點(diǎn)區(qū)別!下面我直接介紹在ZF里是任何使用Smarty的.在使用Smarty之前,我們應(yīng)該先取出在index.php里定義的$view,并且定義好,需要在模版顯示的變量.:PHP實(shí)例
class IndexController extends Zend_Controller_Action { var $views; /*模板對象*/ var $data; /*傳遞模版變量的對象*/ function init() { //拿回注冊過的對象 $this->views = Zend_Registry::get('views'); } function indexAction() { //定義模版顯示的變量 $data[`title′]=hello world; //傳遞變量到模版 $this->views->assign($data); //顯示模版 $this->views->display('index/index.tpl'); } function addAction() { } }
下面我們開始做視圖文件,它們的位置是test/webapp/templates/index/index.tpl:PHP實(shí)例
代碼:PHP實(shí)例
{$title}
這個(gè)時(shí)候,輸入http://127.0.0.1/test看看.應(yīng)該會(huì)出現(xiàn)“hello world 了.PHP實(shí)例
這樣,一個(gè)簡單的實(shí)例就完成了.下面我們結(jié)合Xmlrpc技術(shù)來實(shí)現(xiàn)一個(gè)稍微復(fù)雜一點(diǎn)的實(shí)例!PHP實(shí)例
三、XMLRPCPHP實(shí)例
1、什么是XMLRPCPHP實(shí)例
XMLRPC,顧名思義,就是應(yīng)用了XML技術(shù)的RPC.那么什么是XML和RPC了?PHP實(shí)例
RPC是Remote Procedure Call的縮寫,翻譯成中文就是遠(yuǎn)程過程調(diào)用,是一種在本地的機(jī)器上調(diào)用遠(yuǎn)端機(jī)器上的一個(gè)過程(辦法)的技術(shù),這個(gè)過程也被大家稱為“分布式計(jì)算 ,是為了提高各個(gè)分立機(jī)器的“互操作性 而發(fā)明出來的技術(shù).PHP實(shí)例
XML和RPC一樣也是一個(gè)東西的縮寫,這個(gè)東西就是eXtensible Markup Language,中文意思就是可擴(kuò)展標(biāo)記語言,標(biāo)記語言就是那種用尖括號(hào)(<>)括來括去的那種語言,比如說HTML.XML的可擴(kuò)展性也體現(xiàn)在它只定義了語言的格式,而并沒有定義過多的關(guān)鍵字,也就是通常所說的標(biāo)記(Tag),所以用戶可以自由地選擇定義標(biāo)記.它的這種自由和簡單的語法規(guī)則也使得它廣為流傳,用來表示各種數(shù)據(jù).PHP實(shí)例
2、在ZF中使用XMLRPCPHP實(shí)例
1)創(chuàng)建IndexController.phpPHP實(shí)例
下面我們來完成一個(gè)實(shí)例,為了方便起見,就不建立新的Controller,把剛才我們建立的IndexController修改一下,就能使用了!另外我們還需要建立一個(gè)XMLRPC的服務(wù)端程序.位置在WEB服務(wù)器的根目錄上(在本機(jī)中,也就是在test文件的上級(jí)目錄中,取名為1.php),由于XMLRPC使用到了類庫,我們還需要下載libphpxmlrpc放在library文件夾下!PHP實(shí)例
文件位置:test/webapp/controller/IndexController.php:PHP實(shí)例
class IndexController extends Zend_Controller_Action { var $views; /*模板對象*/ var $data; /*傳遞模版變量的對象*/ public function init() { //拿回注冊過的對象 $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)建客戶端 $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)建顯示模版文件PHP實(shí)例
位置:test/webapp/templates/index/index.tpl:PHP實(shí)例
hello,下面演示的是利用Xmlrpc調(diào)用遠(yuǎn)程服務(wù)器辦法的實(shí)例!并且我們把得到的結(jié)果傳遞到另外的一個(gè)函數(shù)中去!PHP實(shí)例
代碼:PHP實(shí)例
{if $sum} 點(diǎn)一下看看! {/if}
位置: test/webapp/templates/index/add.tpl:PHP實(shí)例
現(xiàn)在是{$time} {$title}你剛才傳遞的是 {$id}
3)創(chuàng)建XMLRPC服務(wù)器端程序PHP實(shí)例
位置:web/1.php:PHP實(shí)例
<?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) { //引入用戶錯(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)在打開http;//127.0.0.1/test/看看.剛才建立的那個(gè)XMLRPC應(yīng)該已經(jīng)建立起來了,輸入數(shù)字,測試一下吧!PHP實(shí)例
更多關(guān)于zend相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Zend FrameWork框架入門教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《Yii框架入門及常用技巧總結(jié)》、《ThinkPHP入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》PHP實(shí)例
希望本文所述對大家基于zend framework框架的PHP程序設(shè)計(jì)有所贊助.PHP實(shí)例
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP編程:Zend Framework+smarty用法實(shí)例詳解》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7296.html