>  기사  >  php教程  >  Zend Framework에 대한 자세한 설명+현명한 사용 사례

Zend Framework에 대한 자세한 설명+현명한 사용 사례

高洛峰
高洛峰원래의
2016-12-26 16:01:331110검색

이 기사의 예에서는 Zend Framework+smarty의 사용법을 설명합니다. 다음과 같이 참고할 수 있도록 모든 사람과 공유하세요.

1. Zend Framework 소개

Zend Framework는 MVC(Model-View-Controller) 구조를 사용합니다. 이는 프로그램을 여러 부분으로 분리하여 개발 및 유지 관리를 더 쉽게 만드는 데 사용됩니다.

Zend Framework를 실행하려면 PHP 5.1.4 이상이 필요하고 웹 서버는 mod_rewrite 기능을 지원하며 이 예에서는 Apache를 사용합니다. http://framework.zend.com/download에서 Zend Framework를 다운로드하세요. .zip 또는 .tar.gz의 두 가지 형식이 있습니다.

2. Zend Framework 구성

1. 디렉터리 구조

Zend Framework는 표준 디렉터리 구조를 사용하지 않지만 여전히 몇 가지 일반적인 디렉터리 구조가 있습니다. 이 디렉토리 구조는 사용자가 Apache 구성을 완전히 제어할 수 있다고 가정합니다. (다음은 이 기계를 예로 든 것입니다. 상황에 따라 변경해야 합니다. 내 서버의 루트 디렉터리는 Web 폴더를 가리킵니다.)

인용:

Web/
test /
/webapp
/controllers
/models
/templates
/templates_c
/library
/webroot
/images
/js
/ css

프로그램의 모델, 뷰 및 컨트롤러 파일을 서로 다른 하위 디렉터리로 분리했습니다. 지원되는 이미지, 스크립트 및 CSS 파일은 webroot 디렉토리 아래의 다양한 하위 디렉토리에 저장됩니다. 다운로드한 Zend Framework 파일은 라이브러리 디렉터리에 위치합니다. 다른 라이브러리 파일이 필요한 경우 여기에 배치할 수 있습니다. 이 예에서는 Smarty 템플릿 기술을 사용하므로 Smarty 라이브러리 파일도 라이브러리 파일 아래에 넣어야 합니다!

2. 시작 파일

1) Configuration.htaccess

프로그램에 액세스하기 위해 단일 항목 파일인 index.php를 사용합니다. 모든 페이지를 확인하고 실행 환경이 올바르게 구성되었는지 확인하세요. 이 목적을 달성하기 위해 .htaccess 파일을 사용하여 다음 내용으로 테스트의 루트 디렉터리에 .htaccess 파일을 추가합니다.

RewriteEngine on
RewriteRule !".(js|ico|gif|jpg|png|css)$ index.php

2) 구성 Apache
동시에 Apache에 대한 몇 가지 설정을 지정하고 Apache 구성 파일 httpd.conf를 열어야 합니다.

1. "#LoadModule rewrite_module module/mod_rewrite.so 앞에 있는 #을 제거하세요!

2. 그런 다음 "AllowOverride None을 찾아 AllowOverride All로 변경하고 아파치를 다시 시작합니다. 그것.

3. 시작 파일 index.php
index.php는 test의 루트 디렉터리에 있습니다. 다음은 index.php의 내용입니다. 🎜>

<?php
//打开错误提示
error_reporting(E_ALL|E_STRICT);
//设定时区
date_default_timezone_set(&#39;Asia/Shanghai&#39;);
//指明引用文件的路径
set_include_path(&#39;.&#39; .
PATH_SEPARATOR . &#39;./library/&#39;.
PATH_SEPARATOR . &#39;./webapp/models/&#39;.
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"=>&#39;./webapp/controllers&#39;));
//抛出异常
$frontController->throwExceptions(true);
//设置基地址,方便以后url的跳转用户,.注意,区分大小写!
$frontController->setBaseUrl(&#39;/test&#39;);
//使用smarty模版需关闭本身的视图助手.
$frontController->setParam(&#39;noViewRenderer&#39;, true);
// 关闭错误提示,发生请求错误时候,转到ErrorController的errorAction控制器
//$frontController->throwExceptions(false);
//对。。进行注册
Zend_Registry::set(&#39;font&#39;, $frontController);
//------------配置Smarty模版 ----------------
include &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,false);
Zend_Registry::set(&#39;views&#39;, $views);
//开始运行程序
$frontController->dispatch();
?>

4) 시작 파일 설명

Zend Framework는 모든 파일이 include_path에 포함되도록 설계되었습니다. 또한 나중에 모델 클래스를 쉽게 로드할 수 있도록 포함 경로에 모델 디렉터리를 포함합니다. 먼저 Zend_Loader 클래스에 액세스할 수 있도록 Zend/Loader.php를 포함해야 합니다. Zend_Loader 클래스에는 다른 Zend Framework 클래스를 로드할 수 있는 정적 메서드가 있습니다. 예:

Zend_Loader::loadClass(&#39;Zend_Controller_Front&#39;);

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(&#39;./application/controllers&#39;);

설정에서는 예외가 발생하지만 서버가 실제로 작동한 후에는 사용자에게 오류 메시지를 표시해서는 안 됩니다.

 
$frontController->throwExceptions(true);

이 예에서는 Smarty 템플릿 기술을 사용하기 때문입니다. 그래서 우리는 ZF 자체와 함께 제공되는 뷰를 닫습니다. $frontController->setParam('noViewRenderer', true); 나중에 점프할 URL을 쉽게 설정할 수 있도록 기본 주소를 설정합니다. $frontController->setBaseUrl('/test');Zend_Registry::set('font', $frontController);다음으로 Smarty를 설정합니다. 먼저 클래스 라이브러리에서 Smarty.class.php 클래스를 참조했습니다. 그리고 그 경로는 정부가 그 위치를 알 수 있도록 설정됩니다. :

include &#39;Smarty/Smarty.class.php&#39;;
/**
* 对smarty模版进行初始化
**/
$views = new Smarty();
//$views->left_delimiter = "{{";
//$views->right_delimiter = "}}";
$views->compile_dir = &#39;./webapp/templates_c&#39;;
$views->cache_dir = &#39;./webapp/templates_c/cache_c&#39;;
$views->template_dir = "./webapp/templates";
function smarty_block_dynamic($param,$content,&$views)
{
return $content;
}
$views->register_block(&#39;dynamic&#39;,&#39;smarty_block_dynamic&#39;,false);

여기서 ZF의 객체 레지스트리(Registry)를 사용하여 $view를 저장하므로 프로그램의 어느 시점에서든 서로 다음 작업을 수행할 수 있습니다. 모두 작업을 수행하기 위해 호출합니다. Zend_Registry::set('views', $views); 설정 후 프로그램을 실행합니다. $frontController->dispatch();

이때 http://127.0.0.1/test를 실행하여 테스트해 보면 됩니다. Fatal error: Uncaught 예외 'Zend_Controller_Dispatcher_Exception'과 함께 '잘못된 컨트롤러 지정(인덱스)' 메시지가 표시됩니다. 이는 아직 프로그램을 설정하지 않았기 때문입니다.

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:

<?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,并且定义好,需要在模版显示的变量。:

class IndexController extends Zend_Controller_Action
{
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get(&#39;views&#39;);
}
function indexAction()
{
//定义模版显示的变量
$data[`title′]=〞hello world〞;
//传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
function addAction()
{
}
}

   

下面我们开始做视图文件,它们的位置是test/webapp/templates/index/index.tpl:

代码:

{$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,中文意思就是可扩展标记语言,标记语言就是那种用尖括号(a8093152e673feb7aba1828c43532094)括来括去的那种语言,比如说HTML。XML的可扩展性也体现在它只定义了语言的格式,而并没有定义过多的关键字,也就是通常所说的标记(Tag),所以用户可以自由地选择定义标记。它的这种自由和简单的语法规则也使得它广为流传,用来表示各种数据。

2、在ZF中使用XMLRPC

1)创建IndexController.php

下面我们来完成一个实例,为了方便起见,就不建立新的Controller,把刚才我们建立的IndexController修改一下,就能使用了!另外我们还需要建立一个XMLRPC的服务端程序。位置在WEB服务器的根目录上(在本机中,也就是在test文件的上级目录中,取名为1.php),由于XMLRPC使用到了类库,我们还需要下载libphpxmlrpc放在library文件夹下!

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

class IndexController extends Zend_Controller_Action
{
var $views; /*模板对象*/
var $data; /*传递模版变量的对象*/
public function init()
{
//拿回注册过的对象
$this->views = Zend_Registry::get(&#39;views&#39;);
$this->font = Zend_Registry::get(&#39;font&#39;);
//得到基地址
$this->baseurl=$this->font->getBaseUrl();
}
function indexAction()
{
@include "libphpxmlrpc/xmlrpc.inc";
@include "libphpxmlrpc/xmlrpcs.inc";
if (isset($_POST[&#39;var1&#39;]) && isset($_POST[&#39;var2&#39;]))
{
//创建客户端
$client = new xmlrpc_client(&#39;http://127.0.0.1/1.php&#39;);
//创建一个实例
@ $msg = new xmlrpcmsg("add", array(
new xmlrpcval($_POST[&#39;var1&#39;], "int"),
new xmlrpcval($_POST[&#39;var2&#39;], "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[&#39;var1&#39;]=$_POST[&#39;var1&#39;];
@$data[&#39;var2&#39;]=$_POST[&#39;var2&#39;];
@$data[&#39;sum&#39;]=$sum;
@$data[`action′]= "$this->baseurl/index/";
//构造完整的url给模版
$time=date("Y-m-d H:i:s")
@$data[&#39;url&#39;]="$this->baseurl/index/add/id/$sum/time/$time";
/传递变量到模版
$this->views->assign($data);
//显示模版
$this->views->display(&#39;index/index.tpl&#39;);
}
function addAction()
{
$data[&#39;title&#39;]="实验一下";
//得到传递的值
$id=$this->_request->getParam("id");
$time=$this->_request->getParam("time");
$data[&#39;id&#39;]="$id";
$data[&#39;time&#39;]="$time";
$this->views->assign($data);
$this->views->display(&#39;index/add.tpl&#39;);
}
}

   

2)创建显示模版文件

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

hello,下面演示的是利用Xmlrpc调用远程服务器方法的实例!并且我们把得到的结果传递到另外的一个函数中去!

代码:

{if $sum}
点一下看看!
{/if}

   

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

现在是{$time}
{$title}你刚才传递的是 {$id}

   

3)创建XMLRPC服务器端程序

位置:web/1.php:

<?php
@include ("libphpxmlrpc/xmlrpc.inc");
@include ("libphpxmlrpc/xmlrpcs.inc");
if ($_SERVER[&#39;REQUEST_METHOD&#39;] != &#39;POST&#39;)
{
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程序设计有所帮助。

더 많은 Zend Framework+현명한 사용 사례 및 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.