Zend Framework使用實例

一、Zend Framework簡介

Zend Framework使用模型-視圖-控制器(Model-View-ControllerMVC))結構。這個用來把你的程序分離成不同部分使得開發和維護變得容易。

運行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 的根目錄中,內容如下:

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的內容

PHP代碼如下:

<?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);

 // 關閉錯誤提示,發生請求錯誤時候,轉到ErrorControllererrorAction控制器

 //$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 類,例如: 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 元素。

我們需要配置前端路由器,這樣它就知道從哪個目錄裏找出我們的控制器。

$frontController = Zend_Controller_Front::getInstance();

$frontController->setControllerDirectory('./application/controllers');

設置拋出異常,但是在服務器真正工作以後,我們不應該顯示錯誤信息給用戶看。

$frontController->throwExceptions(true);

由於在本實例中我們使用Smarty模版技術。所以我們關閉ZF本身自帶的view$frontController->setParam('noViewRenderer', true);設置基地址,方便以後設置url來進行跳轉。$frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);接下來,我們對Smarty進行設置。首先我們在類庫中引用了Smarty.class.php這個類。並且對它的路徑進行了設置,以便讓ZF知道它的位置。

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,後面的id1,分別是往這個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

PHP代碼如下:

<?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,並且定義好,需要在模版顯示的變量。

PHP代碼如下:

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代碼如下:

<head>

<meta content="text/html; charset=UTF-8" http-equiv="content-type" />

<title>{$title}</title>

</head>

<body>

<h1>{$title}<h1>

</body>

</html>

這個時候,輸入http://127.0.0.1/test看看。應該會出現“hello world 了。

這樣,一個簡單的實例就完成了。下面我們結合Xmlrpc技術來實現一個稍微複雜一點的實例!

三、XMLRPC

1、什麼是XMLRPC

    XMLRPC,顧名思義,就是應用了XML技術的RPC。那麼什麼是XMLRPC了? 

   RPCRemote Procedure Call的縮寫,翻譯成中文就是遠程過程調用,是一種在本地的機器上調用遠端機器上的一個過程(方法)的技術,這個過程也被大家稱爲“分佈式計算 ,是爲了提高各個分立機器的“互操作性 而發明出來的技術。

XMLRPC一樣也是一個東西的縮寫,這個東西就是eXtensible Markup Language,中文意思就是可擴展標記語言,標記語言就是那種用尖括號(<>)括來括去的那種語言,比如說HTMLXML的可擴展性也體現在它只定義了語言的格式,而並沒有定義過多的關鍵字,也就是通常所說的標記(Tag),所以用戶可以自由地選擇定義標記。它的這種自由和簡單的語法規則也使得它廣爲流傳,用來表示各種數據。

2、在ZF中使用XMLRPC

1)創建IndexController.php

下面我們來完成一個實例,爲了方便起見,就不建立新的Controller,把剛纔我們建立的IndexController修改一下,就能使用了!另外我們還需要建立一個XMLRPC的服務端程序。位置在WEB服務器的根目錄上(在本機中,也就是在test文件的上級目錄中,取名爲1.php),由於XMLRPC使用到了類庫,我們還需要下載libphpxmlrpc放在library文件夾下!

文件位置:test/webapp/controller/IndexController.php

PHP代碼如下:

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

PHP代碼如下:

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

    <meta content="text/html; charset=UTF-8" http-equiv="content-type" />

    <title>xmlrpc add sample in php</title>

</head>

<h3>hello,下面演示的是利用Xmlrpc調用遠程服務器方法的實例!並且我們把得到的結果傳遞到另外的一個函數中去!<h3>

 <body>

    <form method="POST" action="/test/index/" >

    <input type="text" name="var1" value="{$var1}" />

    +

    <input type="text" name="var2" value="{$var2}" />

    <input type="submit" value="="/>

    <input type="text" name="sum" value="{$sum}" />

    {if $sum}

    <a href="{$url}">點一下看看!</a>

    {/if}

    </form>

 </body>

</html>

 

位置: test/webapp/templates/index/add.tpl

PHP代碼如下:

 <html>

   <head>

   <meta content="text/html; charset=UTF-8" http-equiv="content-type" />

         <title>{$title}</title>

   </head>

   <body>

   現在是{$time}

<h1>{$title}</h1> 你剛纔傳遞的是 {$id}</a>

   </body>

   </html>

3)創建XMLRPC服務器端程序

位置:web/1.php

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)

 {

                //引入用戶錯誤代碼值

                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應該已經建立起來了,輸入數字,測試一下吧!

 
發佈了18 篇原創文章 · 獲贊 0 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章