Zend Framework+smarty用法实例详解


Posted in PHP onMarch 19, 2016

本文实例讲述了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 的根目录中,内容如下:

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 
//打开错误提示
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 类,例如:

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,后面的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('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:

代码:

{$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:

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调用远程服务器方法的实例!并且我们把得到的结果传递到另外的一个函数中去!

代码:

{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['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程序设计有所帮助。

PHP 相关文章推荐
最令PHP初学者们头痛的十四个问题
Jan 15 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
php adodb连接mssql解决乱码问题
Jun 12 PHP
PHP is_dir() 判断给定文件名是否是一个目录
May 10 PHP
php写的带缓存数据功能的mysqli类
Sep 06 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
php实现统计目录文件大小的函数
Dec 25 PHP
round robin权重轮循算法php实现代码
May 28 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
Nov 01 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
PHP whois查询类定义与用法示例
Apr 03 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
ThinkPHP使用Smarty第三方插件方法小结
Mar 19 #PHP
smarty学习笔记之常见代码段用法总结
Mar 19 #PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 #PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 #PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 #PHP
PHP的Yii框架中移除组件所绑定的行为的方法
Mar 18 #PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 #PHP
You might like
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php中设置多级目录session的问题
2011/08/08 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
关于初学PHP时的知识积累总结
2013/06/07 PHP
php使用google地图应用实例
2014/12/31 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
深入解析vue 源码目录及构建过程分析
2019/04/24 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
2020/03/20 jQuery
jquery插件实现轮播图效果
2020/10/19 jQuery
Javascript实现贪吃蛇小游戏(含详细注释)
2020/10/23 Javascript
python关键字and和or用法实例
2015/05/28 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python实现的异步代理爬虫及代理池
2017/03/17 Python
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
深入理解Python中的super()方法
2017/11/20 Python
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
wxPython实现绘图小例子
2019/11/19 Python
python openCV自制绘画板
2020/10/27 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
医药大学生求职简历的自我评价
2013/10/17 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
golang 比较浮点数的大小方式
2021/05/02 Golang
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
2022/04/13 Java/Android