ZendFramework⼊门教程
⼀、Zend Framework简介
1. 什么是ZendFramework
Zend Framework(ZF or ZFW)是PHP的母公司Zend公司开发的⼀套PHP开发框架技术,它提供了⼀个优秀的、简单的综合开发环境,提供了很多可⽤的解决⽅案,可以⽤来建⽴⼀个稳定的、可升级的的Web应⽤。
所谓框架,是整个或者部分系统的可重⽤设计,它⾸先要提供⼀个可复⽤的应⽤参考架构,阐明整个设计、组件之间的依赖关系、责任分配和控制流程,也包含⼀些设计规范等等。它提供了对⼀些通⽤问题的解决⽅案。
另外Zend Framework采⽤常见的MVC模型(在后续具体介绍),这样可以⽐较⽅便的达到关注点分离的⽬的,可以⽐较⽅便的建⽴基于MVC 架构的Web应⽤(典型的MVC Web架构还有Struct等等,它们原理都很类似)(PHP的类似框架还有很多如:yaf)
2. 什么是LAMP
LAMP是Linux+Apache+Mysql+Perl/PHP/Python的缩写,它们是⼀组经常⽤来搭建动态⽹站或者服务器的开源软件,本⾝都是各⾃独⽴的程序,但是因为常被放在⼀起使⽤,拥有了越来越⾼的兼容度,共同组成了⼀个强⼤的Web应⽤程序平台,由于都是开源软件,除了免费使⽤的诱惑,还有可以修改源码、⾃⼰进⾏控制等优点,LAMP是⼤多数⽹站开发者和很多⼤公司(如:Facebook和Baidu)的不⼆选择。从⽹站的流量上来说,70%以上的访问流量是LAMP来提供的,可见LAMP是最强⼤的⽹站解决⽅案.(其它类似的⽅案如MS的.NET框架和Oracle的J2EE框架,三者同样强⼤)
为什么要说LAMP呢,因为这些软件的组合强⼤到只要提到⼀个就必须要提到另外三个的地步,⽽在实验室⽹站的建设中,我们使⽤PHP,我们采取的当然也是LAMP的框架
3. Zend Framework的安装
XAMPP:Apache Friends
Zend安装和使⽤
另外需要注意的是,默认的Zend Framework使⽤MVC机制,它采⽤rewrite的⽅式进⾏跳转,这就需要在apache的配置⽂件中(⼀般是f)修改加⼊允许rewrite的选项,需要的步骤是:
1. 到LoadModule rewrite_modulemodules/mod_rewrite.so将其前⾯的#去掉
2. 在项⽬所在的⽬录下<Directory “projectPath”>中修改AllowOverride的值为All,Order allow,deny / Allow from all
3. 在项⽬所在根⽬录下建⽴.htaccess⽂件,内容为
RewriteEngine on #重写引擎打开
RewriteRule!\.(js|ico|gif|jpg|png|css)$ index.php
#制定除js,ico,gif,jpg,png,css以外的⽂件全都被重置到index.php,index.php为项⽬的⾸页(其实是前端转发控制页)
简单的Zend Framework安装测试⽅法:
创建⽂件test.php内容:
<?php
require_once(‘Zend/Date.php’);
$date=new Zend_Date();
echo $date
>
如果能正常输出则说明Zend安装⼤体正常。
另外,如果想要在View⽂件中使⽤<?=someVariable?>代替<?php echo $value ?>的功能,需要在php.ini中开启short opentag,
short_open_tag = On才可,否则<?=?>的表达式不能被正常解析。
⼆、MVC框架
1. MVC框架是什么
MVC(Model-View-Controller)是⼀种集成了很多设计模式(Design Pattern)的⼀种设计模式,它强制的将程序的输⼊、处理、输出分开,它把程序分为三个核⼼部件:Model,View和Controller,其中
Model:负责数据的处理,包含业务逻辑。
View:负责数据的展现,并获取输⼊。
Controller:负责从View处接收输⼊,并操作Model来完成⽤户需求,然后调⽤View返回数据给⽤户。
2. 典型的MVC框架例⼦
在这⾥举两个MVC的例⼦,⼀个是在传统Desktop程序,另⼀个以Zend Framework为例,详细介绍ZendFramework的MVC。
2.1传统Desktop程序:⽂本编辑器
⽂本编辑器⼤家应该都⽤过,在这⾥使⽤⼀个在《深⼊浅出MFC》中侯捷先⽣使⽤的例⼦,其所要实现的功能不必赘述,有⼀个⽂本框负责展⽰⽂字,⽤户可以对⽂字进⾏修改。
其中的:
Model,负责调⽤操作系统底层⽂件操作API,完成的功能有
a) 读取⽂件内容outputstreamwriter怎么用
b) 修改⽂件内容:包括编辑和删除内容
c) 创建⽂件、删除⽂件、
View,负责展⽰当前⽂件的内容给⽤户,并且负责提供UI界⾯,⽤以操作⽂本,完成的功能有:
a) 展⽰⽂本当前内容
b) 获取⽤户可能的输⼊:⽂本选择,⽂本复制,⽂本粘贴,⽂本编辑,⽂件的打开,删除和新建等等。
Controller,负责响应从View层传递来的⽤户请求,调⽤相应的Model操作,来执⾏⽤户的需求,完成的功能有:
a) 响应View请求,将其转换成对应的Model⽅法调⽤
b) 完成操作后,将返回结果返回给指定View,向⽤户展⽰结果
(注:在⽂本编辑器的功能中,有这样⼀种情况,有多个⽂本窗⼝,展⽰⽂件内容,当有多个窗⼝同时对⼀个⽂件进⾏操作,这样,就有了共同资源的修改问题,⽽在⼀个⽂本窗⼝修改了⽂本之后,其它的⽂本编辑器也应该显⽰修改过的值,这就需要每个⽂本窗⼝对⽂件状态有实时的了解,该如何实现?使⽤观察者模式.)
3. Zend中的MVC框架
在这⾥,我们将简单介绍Zend Framework的MVC组件,并⼤致给出⼀个Zend Framework程序的简单实现。ZendFrameworkd的MVC框架与传统的MVC程序框架思想类似,但是由于应⽤于互联⽹环境中,⼜有了少许不同。
由于使⽤MVC框架,我们需要对项⽬的⽬录结构给出规范,典型的⽬录结构如下
app/
----controllers/
----models/
----views/
----------scripts/
其中app是根⽬录下的⼦⽬录,保存MVC代码,controllers中保存所有的controllers,models⽬录保存所有models代码,views/scripts中保存所有的view代码。
3.1 Zend_Controller
sqlyog和navicat的区别
Zend_Controller是Zend Framework中的Controller部分,其中的Zend_Controller_Front类实现了前端控制器设计模式,
3.1.1前端控制器
前端控制器设计模式:由于互联⽹环境的所有请求都有httpurl请求从浏览器发送给服务器,Web应⽤的输⼊对于服务器来说就是请求,为了实现从请求->对应Controller的映射,我们将所有请求都⾸先发送到前端控制器front controller,由前端控制器进⾏配置,选择合适的Controller进⾏分发(dispatch)请求,再由具体Controller进⾏请求的响应处理。(前端控制器设计模式在Web程序中很常见,Structs也采⽤这种模式)
⼀般的前端控制器都在⼊⼝⽂件index.php中定义(根⽬录下),声明代码为:
// 初始化frontcontroller实例
$front=Zend_Controller_Front::getInstance();
// 开启分发过程中抛出异常的能⼒,默认异常引起之后会被放置在想要对象中
$front->throwExceptions(true);
// 设置默认的处理Controller名称
$front->setDefaultControllerName('home');
// 设置controllers⽬录
$front->setControllerDirectory($dir.'\app\controllers');
在所有的配置都已完毕之时,前端控制器需要负责整个程序(像是Win32程序中的主程序)的请求转发,(类似处理消息循环),并处理分发请求:如
try {
// 开始运⾏
$front->dispatch();
} catch (Exception $e) {
// 处理异常
echo $e;//include_once'exception.php';
}
FrontController的dispatch⽅法可以实现Controller的路由、分发、响应等⼯作,分发过程由三个不同的事件组成:
² 路由(Routing),使⽤路由器router,只执⾏⼀次,在调⽤dispatch()⽅法时利⽤请求对象中的值进⾏。
² 分发(Dispatching),使⽤分发器dispatcher,发⽣在循环中
² 响应(Response),完成处理后前端控制器返回响应对象
3.1.2动作控制器
Zend_Controller:每⼀个具体的Controller都应该是继承于类Zend_Controller_Action,是⼀个动作控制器类,此类有最基本的类Controller ⽅法,⽤来处理相关的View和Model之间的操作,每个具体的Controller都应该继承这个类。
l 操作request\response对象、获取参数:
在动作控制器函数(xxxAction)中,可以通过API访问⼀些常⽤的数据,如:
² request对象:由getRequest()⽅式取得,返回⼀个Zend_Controller_Request_Abstract实例
² response对象:由getResponse()取得,返回⼀个Zend_Controller_Response_Abstract实例,可⽤此对象上的⽅法来修改response对象² request参数:由post或者get传递过来的参数,可以⽤_getParam($key)⽅法或者_getAllParams()获取,也可以由_setParam⽅法来设置request参数(⼀般⽤于转发请求到其他动作)
l 操作视图:
² 视图由Zend_View对象来表⽰,在Zend_Controll_Action中可以通过initView()或render()⽅法来初始化对应的Zend_View对象,默认情况下假定视图存在views/scripts/⼦⽬录中,指定view脚本时基准⽬录为views/scripts/
(⼀般是在Zend_Controller_Action的init⽅法中使⽤initView,在其他xxxAction中使⽤render)
² render()⽤于解析视图,声明为render(string$action=null,string $name=null,bool $noController=false),如果不传递参数,默认的解析脚本是在views/scripts/[controller名]/[action名].$viewSuffix的值
² 注:控制器和动作名称中包含”_”,”.”,”-”的话,这些分隔符会被格式化成”-”
l 转向⽅法:
² _forward($action…)⽅法,⽤于执⾏另外⼀个动作
² _redirect($url…)⽅法,⽤于重定向到另外⼀个地⽅
3.1.3动作助⼿
动作助⼿(Zend_Controller_Action_Helper)可以向Zend_Controller_Action类的动作控制器加⼊功能(runtimeand/or on-demand functionality).
助⼿经纪⼈存在Zend_Controller_Action类中$_helper成员中,⽤来获取和调⽤助⼿。是⼀个Zend_Controller_Action_HelperBroker类的对象,其⽀持addHelper⽅法向经纪⼈中加⼊助⼿(也可以⽤addPrefix和addPath⽅法加⼊)。相当于Action的助⼿管家。
内建的动作助⼿
l FlashMessenger:允许⽤户传递可能需要在下个请求看到的消息,使⽤Zend_Session_Namespace来存储消息(⽤于内部的消息传递)
l Redirector: 转向器,可以帮助程序重定向到新的URL
l ViewRenderer:视图渲染助⼿,可以帮助我们不在controller中创建view实例,view对象⾃动在controller注册,可以根据当前模块⾃动设置视图脚本、助⼿、过滤器路径,指派当前的模块名为助⼿和过滤器的类名前缀,可以⾃动渲染view脚本,我们就可以不写initView和render了。
使⽤⽅法,
// View Render helper
$view=new Zend_View(array('encoding'=>'UTF-8'));
// 创建view render
$view_render=new Zend_Controller_Action_Helper_ViewRenderer($view);
// 设置view脚本的后缀,这⾥使⽤.php
$view_render->setViewSuffix('php');
// 将view renderhelper加⼊动作助⼿中,这样我们就可借助渲染助⼿⾃动渲染后缀为.php的view脚本啦,渲染的寻规则和上述默认initView的规则⼀致.
Zend_Controller_Action_HelperBroker::addHelper($view_render);
3.2 Zend_View
Zend_View的使⽤⽅法:在Controller中创建⼀个Zend_View实例(也可以由View Render Helper帮忙创建,我们就不⽤⾃⼰写了)。然后将view中需要的变量赋给它就可以了,然后使⽤render渲染view即可。
⼀般代码为:
<?php
$view=newZend_View()
$view->a=’’
$view->c=’’//或者⽤view的assign(),⽀持关联数组赋值
echo$view->render(‘someView.php’)
>
我们采⽤的⽅式为在view脚本中使⽤html与php相混合的形式,要⽤到的变量由controller传递给它,$this->view->xxx;在脚本中使⽤$this->xxx的⽅法访问。
mysql递归查询所有子节点
3.3 Zend_Model
在Model部分⼀般是完成对数据的访问,管理以及实现业务逻辑,⼀般model的存储⽬录在和Controllers同根⽬录的models⽂件夹
中,Model⼀般就是之间的PHP类就可以了。⽽⼀般我们在构建Web应⽤中数据都存在数据库⾥,在这⾥就简单讨论下Zend中对数据库的⽀
持吧。
Zend_Db组件是Zend Framework中的数据库⽀持部分,由Zend_Db_Adapter、Zend_Db_Statement、Zend_Db_Profiler、
Zend_Db_Select、Zend_Db_Table、Zend_Db_Table_Row以及Zend_Db_Table_Rowset等组成
Zend_Db_Adapter是Zend Framework的数据库抽象层API,是基于PDO的,可以⽀持多种数据库。Adapter的配置⽅式为
// 连接mysql数据库
$db=Zend_Db::factory('PDO_MYSQL', $config);
$config中存储⼀些连接数据库的配置信息,如地址,端⼝,⽤户名,密码,使⽤的数据库名等。在连接之后就可以直接使⽤$db->query()的⽅法查询数据库了。
Zend_Db_Adapter的⽀持的操作:
l query($sql,$bind=array()),查询数据库,$bind为需要绑定的数字
l queryInto($text,$value,$type=null)实现对SQL的⽆害化处理
l insert($table,array $bind),插⼊数据,$table为表明,$bind为表的字段与插⼊数据直接的绑定数组。
l lastInserId($tableName=null,$primaryKey=null),返回刚刚插⼊数据的ID
l fetchRow($sql,$bind=array()),⽤于查询SQL的返回结果,返回的结果可以⽤foreach($resultas $key=>$value)的形式遍历。
l delete($table,$where=’’)在数据库删除表$table记录php filter
l update($table,array $bind,$where=’’)⽤于在表$table上根据$where的限制条件改变$bind数组相关的键值内容。
由上述的Zend_Db_Adapter就可以⼤体上的完成数据库的操作,我们的实验室⽹站也基本就⽤了Zend_Db_Adapter的相关内容,⽽其他的Zend_Db控件则提供了各种更强⼤的功能,⼤家可以⾃⼰发掘,这⾥不再赘述
三、Zend常⽤控件
上⾯说了这么多MVC什么的,下⾯通过给出在登录过程中的⽤到的ZendFramework的具体实例,说明Zend Framework的⼀些简单的组件⽤法。
1. 从登录说起python入门教程app
⼀个简单的登录过程我们都再了解不过了,⾸先我们需要给出⼀个输⼊⽤户名密码的Form,然后⽤户输⼊完⽤户名密码之后,点击submit提交,我们的程序将⽤户输⼊与后台数据库中的数据进⾏⽐较,查看是否⾝份验证通过,验证通过则保存⼀份Session便于⽤户访问,否则则提⽰⽤户⽤户名密码输⼊错误,重新输⼊。复杂的登录控制还包括验证码等内容,我们在此处不讨论。
注:关于登录有很多内容可谈,⽐如单点登录⼜是什么?⼤家可以⾃⼰查查看看
下⾯给出登录控制Controller的Init⽅法和Login动作:相关的内容在后⾯补齐:
⾸先给出Controller的初始化函数init,⼀般在这初始化各种属性
function init()
{
// 取得数据库接⼝,事先存储在对象注册表Zend_Registry中
$this->db=Zend_Registry::get('database');
// 设置view的action和controller属性
$this->view->action=$this->_getParam('action');
$this->view->controller=$this->_getParam('controller');
// 默认载⼊的js,⽅便在view中使⽤
$this->view->javascript=array('jquery.inline.js', 'paper.js');
>什么叫程序设计语言

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。