本文實例講述了Zend Framework+smarty用法。分享給大家供大家參考,具體如下:
一、Zend Framework簡介
Zend Framework使用模型-視圖-控制器(Model-View-Controller(MVC))結構。這個用來把你的程序分離成不同部分使得開發和維護變得容易。
運行Zend Framework需要:PHP 5.1.4 (或更高) 、Web 服務器支持 mod_rewrite功能,本實例采用Apache。 從這里http://framework.zend.com/download下載 Zend Framework,有兩種格式.zip或者.tar.gz。
二、Zend Framework的配置
1、目錄結構
雖然Zend Framework 沒有強求使用一個標準的目錄結構,但是還是有一些通用的目錄結構。這個目錄結構假設你完全控制Apache 的配置。(下面以本機做例子,各位需根據自己的情況進行更改,我的服務器的根目錄指向的是Web文件夾)
引用:
Web/
test/
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/css
我們已經把程序中的模型、視圖和控制器的文件分離到不同的子目錄中。支持的圖像,腳本和CSS 文件被存放在webroot 目錄下的不同子目錄中。下載的Zend Framework 文件放在 library 目錄下。如果我們還需要其他庫文件,都可以放在這里。在這個實例中,我們使用到了Smarty模版技術,所以Smarty 的庫文件我們也應該放在library文件下!
2、啟動文件
1) 配置.htaccess
我們使用單一的入口文件index.php來對我們的程序進行訪問,這給我們提供了程序中所有頁面的中心點并確保運行環境配置正確。我們用.htaccess 文件來實現這個目的,添加.htaccess 文件在test 的根目錄中,內容如下:
1
2
|
RewriteEngine on RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php |
2)配置Apache
與此同時,我們還需要對apache進行一些設置,打開apache的配置文件 httpd.conf。
1、找到“#LoadModule rewrite_module modules/mod_rewrite.so 這句話,把前面的#去掉!
2、然后再找到“AllowOverride None 改成AllowOverride All,重新啟動apache即可。
3、啟動文件index.php
index.php放在test的根目錄下,下面是index.php的內容::
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
<?php //打開錯誤提示 error_reporting (E_ALL|E_STRICT); //設定時區 date_default_timezone_set( 'Asia/Shanghai' ); //指明引用文件的路徑 set_include_path( '.' . PATH_SEPARATOR . './library/' . PATH_SEPARATOR . './webapp/models/' . PATH_SEPARATOR . get_include_path()); //必須手動加載Loader.php include "Zend/Loader.php" ; //自動加載類,使用時,直接實例化使用 function __autoload( $class ){ Zend_Loader::loadClass( $class ); } //getInstance()方法用來獲取前端控制器實例 $frontController = Zend_Controller_Front::getInstance(); //設定前端路由器的工作目錄 $frontController ->setControllerDirectory( array ( "default" => './webapp/controllers' )); //拋出異常 $frontController ->throwExceptions(true); //設置基地址,方便以后url的跳轉用戶,.注意,區分大小寫! $frontController ->setBaseUrl( '/test' ); //使用smarty模版需關閉本身的視圖助手. $frontController ->setParam( 'noViewRenderer' , true); // 關閉錯誤提示,發生請求錯誤時候,轉到ErrorController的errorAction控制器 //$frontController->throwExceptions(false); //對。。進行注冊 Zend_Registry::set( 'font' , $frontController ); //------------配置Smarty模版 ---------------- include 'Smarty/Smarty.class.php' ; /** * 對smarty模版進行初始化 **/ $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 ); //開始運行程序 $frontController ->dispatch(); ?> |
4)啟動文件說明
Zend Framework 是這樣設計的,所有的文件必須包含在 include_path 中。我們也把我們的模型目錄包含在 include path 中,這樣我們以后就能很容易加載我們的模型類。一開始,我們必須 include Zend/Loader.php,這樣我們就能訪問Zend_Loader 類,在Zend_Loader 類中有靜態方法使我們能夠加載其他Zend Framework 類,例如:
1
|
Zend_Loader::loadClass( 'Zend_Controller_Front' ); |
Zend_Loader::loadClass 加載已經命名的類。它是把下劃線轉換成路徑隔離符來實現的,并在最后加上.php 后綴。這樣,類Zend_Controller_Front 將從Zend/Controller/font.php 加載。如果你在你的類庫里使用相同的命名規則,就可以用Zend_Loader::loadCass()來加載它們。我們需要加載控制器類和路由類。
前端控制器用路由類來映射請求的 URL 到正確的 PHP 函數,然后顯示頁面。為了能使路由工作,需要解決 URL 的哪一部分是指向index.php 的路徑,這樣它就可以在那個點后面尋找url 元素。
我們需要配置前端路由器,這樣它就知道從哪個目錄里找出我們的控制器。
1
2
|
$frontController = Zend_Controller_Front::getInstance(); $frontController ->setControllerDirectory( './application/controllers' ); |
設置拋出異常,但是在服務器真正工作以后,我們不應該顯示錯誤信息給用戶看。
1
|
$frontController ->throwExceptions(true); |
由于在本實例中我們使用Smarty模版技術。所以我們關閉ZF本身自帶的view。$frontController->setParam('noViewRenderer', true);設置基地址,方便以后設置url來進行跳轉。$frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);接下來,我們對Smarty進行設置。首先我們在類庫中引用了Smarty.class.php這個類。并且對它的路徑進行了設置,以便讓ZF知道它的位置。:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
include 'Smarty/Smarty.class.php' ; /** * 對smarty模版進行初始化 **/ $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來進行存貯,這樣,在程序的任何對方,我們都可以調用它來進行操作。Zend_Registry::set('views', $views);設置好了以后,運行程序。$frontController->dispatch();
這個時候,你如果運行http://127.0.0.1/test 來進行測試。會發現有個錯誤類似 Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (index)' in…這個是因為我們還沒有設置好我們程序。
3、設置程序
在設置文件以前,理解Zend Framework 如何組織頁面很重要。每個應用程序的頁面叫做 action ,許多 action 組成控制器。例如,對于這樣一個格式的 URL http://localhost/test/news/view/id/1 來說,控制器是news, action 是view,后面的id和1,分別是往這個actionView傳遞的參數和值。
Zend Framework 控制器把 index 作為一個缺省的action 而保留為特別的action。這樣,對于http://localhost/test/news/ 這樣的url,在news控制器里的 index action將被執行。Zend Framework 也保留了一個缺省的控制器,也叫做index。這樣,http://localhost/test/ 將執行 index控制器下的 action index。
4、設置控制器
現在可以設置控制器了。在Zend Framework 里,控制器是一個必需被叫做{Controller name}Controller 的類。注意{Controller name}必需以大寫字母開頭。并且,這個類必須在叫做{Controller name}Controller.php這樣的文件中,這個文件還必需在特定的控制器目錄中。強調一下,{Controller name}必需以大寫字母開頭并其他字母一定是小寫。每個action是在控制器類里的public 函數,名字必需是{action name}Action。在這里,{action name}應該以小寫字母開頭。這樣在文件 test/webapp/controllers/IndexController.php 里我們的控制器類叫做 IndexController,位置:test/webapp/controllers/IndexController.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php class IndexController extends Zend_Controller_Action { function init() { } function indexAction() { } function addAction() { } } ?> |
我們現在有三個我們想使用的action,直到我們設置好視圖,它們才工作。其中function init是個特殊的函數,簡單的說,它就是在controller中的構造函數時調用的函數。
每個action的 URL 如下:
http://localhost/test/ in IndexController::indexAction()
http://localhost/test/index/add in IndexController::addAction()
現在,我們在程序里有個能工作的路由器和每個頁面的 action。
5、設置視圖
因為本實例使用的的是Smarty模版,所以和ZF本身的View視圖在實現過程中,稍微有點區別!下面我直接介紹在ZF里是任何使用Smarty的。在使用Smarty之前,我們應該先取出在index.php里定義的$view,并且定義好,需要在模版顯示的變量。:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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:
代碼:
1
|
{ $title } |
這個時候,輸入http://127.0.0.1/test看看。應該會出現“hello world 了。
這樣,一個簡單的實例就完成了。下面我們結合Xmlrpc技術來實現一個稍微復雜一點的實例!
三、XMLRPC
1、什么是XMLRPC
XMLRPC,顧名思義,就是應用了XML技術的RPC。那么什么是XML和RPC了?
RPC是Remote Procedure Call的縮寫,翻譯成中文就是遠程過程調用,是一種在本地的機器上調用遠端機器上的一個過程(方法)的技術,這個過程也被大家稱為“分布式計算 ,是為了提高各個分立機器的“互操作性 而發明出來的技術。
XML和RPC一樣也是一個東西的縮寫,這個東西就是eXtensible Markup Language,中文意思就是可擴展標記語言,標記語言就是那種用尖括號(<>)括來括去的那種語言,比如說HTML。XML的可擴展性也體現在它只定義了語言的格式,而并沒有定義過多的關鍵字,也就是通常所說的標記(Tag),所以用戶可以自由地選擇定義標記。它的這種自由和簡單的語法規則也使得它廣為流傳,用來表示各種數據。
2、在ZF中使用XMLRPC
1)創建IndexController.php
下面我們來完成一個實例,為了方便起見,就不建立新的Controller,把剛才我們建立的IndexController修改一下,就能使用了!另外我們還需要建立一個XMLRPC的服務端程序。位置在WEB服務器的根目錄上(在本機中,也就是在test文件的上級目錄中,取名為1.php),由于XMLRPC使用到了類庫,我們還需要下載libphpxmlrpc放在library文件夾下!
文件位置:test/webapp/controller/IndexController.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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' ])) { //創建客戶端 $client = new xmlrpc_client( 'http://127.0.0.1/1.php' ); //創建一個實例 @ $msg = new xmlrpcmsg( "add" , array ( new xmlrpcval( $_POST [ 'var1' ], "int" ), new xmlrpcval( $_POST [ 'var2' ], "int" ))); //發送信息, $response = $client ->send( $xmlrpc_message );,服務器返回xmlrpcresp的一個實例 $retval = $client ->send( $msg ); if ( $retval ->faultCode()) { print_r( "發生一個錯誤: " ); print_r( "原因: " . htmlspecialchars( $retval ->faultString())); } else { //$retval->value()獲取應答的xmlrpcval(也就是服務器端返回的結果), $retval ->value()->scalarval();得到描述應答結果的PHP變量 $sum = $retval ->value()->scalarval(); } } @ $data [ 'var1' ]= $_POST [ 'var1' ]; @ $data [ 'var2' ]= $_POST [ 'var2' ]; @ $data [ 'sum' ]= $sum ; @ $data [`action′]= "$this->baseurl/index/" ; //構造完整的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' ]= "實驗一下" ; //得到傳遞的值 $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)創建顯示模版文件
位置:test/webapp/templates/index/index.tpl:
hello,下面演示的是利用Xmlrpc調用遠程服務器方法的實例!并且我們把得到的結果傳遞到另外的一個函數中去!
代碼:
1
2
3
|
{ if $sum } 點一下看看! {/ if } |
位置: test/webapp/templates/index/add.tpl:
1
2
|
現在是{ $time } { $title }你剛才傳遞的是 { $id } |
3)創建XMLRPC服務器端程序
位置:web/1.php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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 ) { //引入用戶錯誤代碼值 global $xmlrpcerruser ; //返回一個PHP數組 $val = php_xmlrpc_decode( $params ); $ret = $val [0] + $val [1]; return new xmlrpcresp( new xmlrpcval( $ret , "int" )); } //創建一個xmlrpc_server的實例: $server = new xmlrpc_server( array ( "add" => array ( "function" => "add" , "signature" => $add_sig , "docstring" => $add_doc ))); ?> |
OK,現在打開http;//127.0.0.1/test/看看。剛才建立的那個XMLRPC應該已經建立起來了,輸入數字,測試一下吧!
希望本文所述對大家基于zend framework框架的PHP程序設計有所幫助。