




免费预览已结束,剩余28页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Zend Framework & MVC 介绍Zend FrameworkZend Framework 是一个为PHP5开发的开源、面向对象的web应用程序框架。Zend Framework 经常被称为“组件库”,因为它有许多松散链接的、几乎独立使用的组件。但是Zend Framework 也提供高级的“模型-试图-控制器(MVC)”组件(implementation),它能够为你的应用程序建立一个基本结构。带有简短描述的Zend Framework完整组件列表可以在 components overview中找到。这个快速教程将向你介绍一些Zend Framework的最常用的组件,包括Zend_Controller, Zend_Layout, Zend_Config, Zend_Db, Zend_Db_Table, Zend_Registry,,还包括一些制图助手。 使用这些组件,我们将在几分钟内建立一个简单的数据库驱动的留言板(guestbook)应用程序。程序的完整源代码可以从下面的压缩文件中得到: zip tar.gzModel-View-Controller这就是每个人谈论的MVC模式。为什么应该关心?MVC不仅仅是听起来时髦,随时可以读出的由三个首字母组成的缩略语,它几乎已经成为web应用程序的设计标准。有充分的理由相信,大多数的web应用程序代码属于下面三个类别中的一个:展示、业务逻辑和数据存取。MVC模式模型分开关注这三个方面(The MVC pattern models this separation of concerns well)。最终,展示代码将成为带有业务逻辑和数据存储代码的应用程序的一部分。许多开发者已经发现这种为了组织代码而定义明确的分离,特别是当不止一个开发者工作于同一个应用程序时。注:更多信息我们来打破这种模式,来看看各个单件: 模型(Model)-这是你的应用程序的一部分,其在一系列抽象概念后定义了基本功能。数据访问例程和一些业务逻辑将在这个模型中定义。视图(View)-视图精确定义什么将展现给用户,通常控制器传递数据给每个视图按某种格式渲染。视图也经常从用户收集代码。这里是在你的MVC应用程序中很可能发现HTML标记的地方控制器(Controller)-控制器将整个模式绑定在一起。他们基于用户的请求和其他因素操纵模型,决定哪个视图去显示,传递每个视图都需要的数据,或者完全的将控制权交给另一个控制器。多数 MVC专家建议:尽可能小的保持控制器(keeping controllers as skinny as possible) .当然关于这个关键性的模式有有更多的话要说,但是应该给你足够的背景去明白这个我们要建立的留言板(guestbook)应用程序创建你的项目为了创建你的项目,你必须首先下载和提取ZendFramework。安装ZendFramework得到带有完整PHP堆栈的ZendFramework的最容易的方法是安装Zend Server。Zend Server已经有为Mac OSX、Windows、Fedora Core 和Ubuntu的本地安装版本,也有一个兼容大多数Linux发布版本的通用安装包。在安装ZendServer之后,在Mac OSX和Linux中,框架文件存储在/usr/local/zend/share/ZendFramework,在windows上,存储在C:Program FilesZendZendServershareZendFramework。Include_path已经被配置包含Zend Framework。另外,你也可以下载最新版本的Zend Framework并提取内容( Download the latest version of Zend Framework),记下来你在哪里做的(make a note of where you have done so)。可选的,你可以将档案(archive)的library/子目录路径加入到到你的php.ini中include_path设置中。(Optionally, you can add the path to the library/ subdirectory of the archive to your php.inis include_path setting.)就这么简单!Zend Framework已经被安装并可以使用了创建你的项目注: zf 命令行工具Make a note of the absolute path to this script. Wherever you see references to the command zf, please substitute the absolute path to the script. On Unix-like systems, you may want to use your shells alias functionality: alias zf.sh=path/to/ZendFramework/bin/zf.sh. If you have problems setting up the zf command-line tool, please refer to the manual.在你的Zend Framework安装目录中有个bin/子目录,里面含有分别为Unix用户和Window用户准备的zf.sh和zf.bat脚本。记下这个脚本的绝对路径。无论在哪里看到zf命令的参考(references),请替代为脚本的绝对路径。在类Unix系统中,你可能想使用shell的别名函数:alishzf.sh=path/to/ZendFramework/bin/zf.sh.如果你再安装zf命令行工具是有任何问题,请参考手册。打开终端(windows:开始-运行,然后使用cmd命令)。到你准备开始新项目的目录。然后使用相应的脚本路径并且执行下面当中的一个:1 % zf create project quickstart运行这个命令将创建你的基本网站结构,包括你的初始控制器和视图。目录树看起来像下面这样:2 quickstart3 |- application4 | |- Bootstrap.php5 | |- configs6 | | - application.ini7 | |- controllers8 | | |- ErrorController.php9 | | - IndexController.php10 | |- models11 | - views12 | |- helpers13 | - scripts14 | |- error15 | | - error.phtml16 | - index17 | - index.phtml18 |- library19 |- public20 | |- .htaccess21 | - index.php22 - tests23 |- application24 | - bootstrap.php25 |- library26 | - bootstrap.php27 - phpunit.xml这个时候,如果你还没有将Zend Framework加入到你的include_path,我们推荐或者拷贝或者链接它到你的library/目录,无论哪种情况,你将想或者递归的拷贝或者链接Zend Framework 安装目录的library/Zend/子目录到你的项目的library/目录。在类unix系统中,它将象下面这样:28 # Symlink:29 % cd library; ln -s path/to/ZendFramework/library/Zend .30 31 # Copy:32 % cd library; cp -r path/to/ZendFramework/library/Zend .在windows系统中,在资源管理其中可以很容易的做这个事情。既然项目已经创建了,开始要弄懂的主要的工作就是引导程序(bootstrap),配置(configuration),动作控制器(action controllers)和视图(views)。引导程序(Bootstrap)引导类定义哪些资源和组件要去初始化。默认情况下,Zend Framework 的前端控制器是被初始化的,并且使用application/controllers/ 作为寻找动作控制器的默认的目录(稍后更多)。这个类看起来像这样:33 / application/Bootstrap.php34 35 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap36 37 就想你看到的,要开始的内容没有多少配置Zend Framework自身是没有配置的,你经常需要配置你的应用程序。默认的配置位于application/configs/application.ini,它包含一些设置你的PHP环境的基本指令(比如,打开或关闭错误报告),指示你的引导类(bootstrap class)路径(以及它的类名),还有你的动作控制器路径,它看起来像下面这样:38 ; application/configs/application.ini39 40 production41 phpSettings.display_startup_errors = 042 phpSettings.display_errors = 043 includePaths.library = APPLICATION_PATH /./library44 bootstrap.path = APPLICATION_PATH /Bootstrap.php45 bootstrap.class = Bootstrap46 appnamespace = Application47 resources.frontController.controllerDirectory = APPLICATION_PATH /controllers48 resources.frontController.params.displayExceptions = 049 50 staging : production51 52 testing : production53 phpSettings.display_startup_errors = 154 phpSettings.display_errors = 155 56 development : production57 phpSettings.display_startup_errors = 158 phpSettings.display_errors = 1这个文件的许多东西应该注意,首先,当使用INI类型的配置,你应该直接提到常量并且扩展它们;APPLICATION_PATH 实际上是一个常量。另外注意有许多定义的部分:production,staging,testing和development。后面三个继承“production”环境的设置。这是一个有用的组织配置方法去确信适当的配置在应用程序开发的每个阶段都是可用的。动作控制器应用程序的动作控制器包含应用程序工作流,并且做映射请求到适当模型和视图的工作。 一个动作控制器应该有一个或多个以“Action”结尾的方法;这些方法可能后面通过web被请求。默认的,Zend Framework URLs按照“/controller/action” 模式,这里“controller”映射动作控制器名(减去“Controller”后缀),“action”映射一个动作方法(减去“Action”后缀 )。典型的,你总是需要一个IndexController,这是一个后备控制器(fallback controller),而且它也是站点的主页。还需要一个ErrorController,它为了指示诸如HTTP 404错误(没有发现控制器或者动作)和HTTP 500错误的发生(应用程序错误)。默认的 IndexController 像下面这样:59 / application/controllers/IndexController.php60 61 class IndexController extends Zend_Controller_Action62 63 64 public function init()65 66 /* Initialize action controller here */67 68 69 public function indexAction()70 71 / action body72 73 默认的 ErrorController像下面这样:74 / application/controllers/ErrorController.php75 76 class ErrorController extends Zend_Controller_Action77 78 79 public function errorAction()80 81 $errors = $this-_getParam(error_handler);82 83 switch ($errors-type) 84 case Zend_Controller_Plugin_ErrorHandler:EXCEPTION_NO_ROUTE:85 case Zend_Controller_Plugin_ErrorHandler:EXCEPTION_NO_CONTROLLER:86 case Zend_Controller_Plugin_ErrorHandler:EXCEPTION_NO_ACTION:87 88 / 404 error - controller or action not found89 $this-getResponse()-setHttpResponseCode(404);90 $this-view-message = Page not found;91 break;92 default:93 / application error94 $this-getResponse()-setHttpResponseCode(500);95 $this-view-message = Application error;96 break;97 98 99 $this-view-exception = $errors-exception;100 $this-view-request = $errors-request;101 102 你会注意到:(1)IndexController没有包含真是代码;(2)ErrorController提到视图属性。这导致我们很好的进入到下一个主题视图Zend Framework中的视图是用普通的PHP代码写的。视图脚本放置在application/views/scripts/ 中,这里脚本被使用控制器名称进一步的分类。在我们的示例中,我们已经有了一个IndexController和一个ErrorController,因此在视图脚本目录有相应的index/ 和 error/ 子目录。在这些子目录中,随后你将发现和创建对应每个暴露的(exposed)控制器动作的视图脚本。在默认情况下,我们会有视图脚本index/index.phtml 和error/error.phtml.视图脚本可以包含任何你想要的标记,并且使用结束标记区插入PHP指令。下面的代码是默认安装下index/index.phtml视图脚本:103 104 105 106 a:link,107 a:visited108 109 color: #0398CA;110 111 112 span#zf-name113 114 color: #91BE3F;115 116 117 div#welcome118 119 color: #FFFFFF;120 background-image: url(/images/bkg_header.jpg);121 width: 600px;122 height: 400px;123 border: 2px solid #444444;124 overflow: hidden;125 text-align: center;126 127 128 div#more-information129 130 background-image: url(/images/bkg_body-bottom.gif);131 height: 100%;132 133 134 135 136 Welcome to the Zend Framework!137 This is your projects main page138 139 140 141 142 143 144 Helpful Links: 145 Zend Framework Website |146 Zend Framework147 Manual148 149 150 151 Error/error.phtml视图脚本有点更加有趣,因为它使用一些PHP的条件语句。152 153 155 156 157 158 Zend Framework Default Application159 160 161 An error occurred162 message ?163 164 env): ?165 166 Exception information:167 168 Message: exception-getMessage() ?169 170 171 Stack trace:172 exception-getTraceAsString() ?173 174 175 Request Parameters:176 request-getParams(), 1) ?177 178 179 180 181 创建一个虚拟主机为了这个快速开始的目的,我们将假设你在使用Apache web服务器。Zend Framework完美的工作在其他的web服务器包括Microsoft IIS,lighttppd,ngix等等但是多数的开发者最低程度的应该熟悉Apache。并且它提供一个容易的Zend Framework 的目录结构和重写能力的简单介绍。为了创建你的vhost,你应该知道httpd.conf文件的位置,还有一些需要知道的其他的配置文件的位置(and potentially where other configuration files are located)。一些常见的地点:/etc/httpd/httpd.conf (Fedora, RHEL, and others)/etc/apache2/httpd.conf (Debian, Ubuntu, and others)/usr/local/zend/etc/httpd.conf (Zend Server on *nix machines)C:Program FilesZendApache2conf (Zend Server on Windows machines)在你的httpd.conf中(或者在一些系统的 httpd-vhosts.conf中),你需要去做两件事情。首先,确信NameVirtualHost被定义,典型的,你将把它设为“*:80”。其次,定义一个虚拟主机:182 183 ServerName quickstart.local184 DocumentRoot /path/to/quickstart/public185 186 SetEnv APPLICATION_ENV development187 188 189 DirectoryIndex index.php190 AllowOverride All191 Order allow,deny192 Allow from all193 194 有几件事情要注意。首先,注意我们的项目中的DocumentRoot 设置要明确指定public子目录;这意味着只有在那个目录中的文件在任何时候能够被服务器直接服务。其次,注意“AllowOverride”的Order和Allow指令;我们在项目中可以使用htacess文件,在开发过程中,这是一个好的办法,因为它可以防止当你改变你的站点指令的时候不断重新启动web服务器。实际上,在产品中,你应该可能将你的htaccess文件的内容放到你的服务器设置中并且禁用htaccess。第三,注意SetEnv命令,它要做的是为你的虚拟主机设置环境变量,这个变量将在index.php中为我们的Zend Framework应用程序设置APPLICATION_ENV常量。在产品中,你能够省略这个指令(在这种情况下,将使用默认值“产品”)或者明确的设定它为“产品”。最后,你需要在你的hosts文件中增加一个条目,对应于在ServerName指令中设定的值,在类Unix系统中,这个文件通常位于/etc/hosts;在windows中,你通常会在c:windowssystem32driversetc中找到它。无论什么系统,这个条目看起来会是这样:195 quickstart.local开始你的webserver(或者重新启动它),你就可以准备开始了。检查到目前为止,你应该能够启动你的初步Zend Framework应用。在浏览器中键入在前面的章节中配置的服务器名,你应该可以看到一个欢迎页面 创建布局你可能已经注意到在前面章节中的视图脚本是HTML片段而非完整的页面代码。这是被设计成这样的。我们想让返回内容的动作只与动作本身相关,而不是与作为一个整体的应用程序相关。现在我们必须组合产生的内容到完整的HTML页面。我们还希望应用程序有一个一致的外观和感觉。我们将使用一个全局的站点布局去完成这两个任务。Zend Framework有两种设计模式去实施布局: 两步视图法 和 组合视图法.两步视图法经常与 变换视图 模式联合使用。基本思想是你的应用程序视图创建内容(representation),然后把它注入到主视图以便最后的转换。组合视图模式处理一个或多个原子视图、应用程序视图。在Zend Framework中,Zend Layout 结合这些模式的思想。不是每个动作视图脚本需要包括全站内容(artifacts),替代的是他们只要关注他们自己的责任。偶然的,你可能在你的全站视图脚本中需要特定应用信息。幸运的是,Zend Framework提供了许多视图占位符以便在你的动作视图脚本中提供那些信息要开始使用Zend_Layout,首先我们需要通知引导程序(bootstrap)去使用布局资源。这个可以使用“zf enable layout”命令:196 % zf enable layout197 Layouts have been enabled, and a default layout created at198 application/layouts/scripts/layout.phtml199 A layout entry has been added to the application config file.正如命令所指出的那样,application/configs/application.ini 被更新了,现在在“production”节中包含如下内容200 ; application/configs/application.ini201 202 ; Add to production section:203 resources.layout.layoutPath = APPLICATION_PATH /layouts/scripts最终的INI文件看起来像下面这样:204 ; application/configs/application.ini205 206 production207 ; PHP settings we want to initialize208 phpSettings.display_startup_errors = 0209 phpSettings.display_errors = 0210 includePaths.library = APPLICATION_PATH /./library211 bootstrap.path = APPLICATION_PATH /Bootstrap.php212 bootstrap.class = Bootstrap213 appnamespace = Application214 resources.frontController.controllerDirectory = APPLICATION_PATH /controllers215 resources.frontController.params.displayExceptions = 0216 resources.layout.layoutPath = APPLICATION_PATH /layouts/scripts217 218 staging : production219 220 testing : production221 phpSettings.display_startup_errors = 1222 phpSettings.display_errors = 1223 224 development : production225 phpSettings.display_startup_errors = 1226 phpSettings.display_errors = 1这个指令告诉你的应用程序在application/layouts/scripts去寻找布局视图脚本。如果你检查你的目录树,你会看到这个目录已经为你创建了layout.phtml文件。我们也想确信我们的应用程序有一个XHTML文档类型(doctype)声明。为了确信这点,我们需要增加一个资源到我们的引导程序(bootstrap)中。在引导程序(bootstrap)中增加资源的最简单方法是仅仅创建一个以_init短语开始的protected方法。在这种情况下,我们想去初始化文档类型(doctype),所以我们再初始(bootstrap)类中将创建一个_initDoctype()方法:227 / application/Bootstrap.php228 229 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap230 231 protected function _initDoctype()232 233 234 在这个方法里,我们需要提示视图使用恰当的文档类型(doctype)。但是视图对象从哪里来呢?简单的解决办法是去初始化视图资源。一旦我们有了,我们能够从引导程序(bootstrap)中取出(pull)视图对象并使用它。 为了初始化视图资源,在你的application/configs/application.ini 文件中“production”部分增加下面的行:235 ; application/configs/application.ini236 237 ; Add to production section:238 resources.view =这个告诉我们去初始化没有选项的视图(说明视图键是一个数组,并且我们没有传递任何数据给它)。既然我们有一个视图,让我们充实我们的_initDoctype()方法。在这个方法里面,我们将首先确信视图资源已经运行,提取视图对象,然后配置它239 / application/Bootstrap.php240 241 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap242 243 protected function _initDoctype()244 245 $this-bootstrap(view);246 $view = $this-getResource(view);247 $view-doctype(XHTML1_STRICT);248 249 现在我们已经初始化Zend_Layout并且已经设置了文档类型(Doctype),让我们来创建我们全站的布局250 251 doctype() ?252 253 254 255 Zend Framework Quickstart Application256 headLink()-appendStylesheet(/css/global.css) ?257 258 259 260 261 ZF Quickstart Application262 263 264 a href=url(265 array(controller=guestbook),266 default,267 true) ?Guestbook268 269 270 271 layout()-content ?272 273 274 我们使用layout()视图助手获得我们的应用程序内容,并访问“content”键。如果你想,你可以渲染其他的响应片段,但是大多是情况下,必须做的就是这么多。还要注意使用headLink()占位符。这是产生HTML元素的简单方法,以及在你整个应用程序中跟踪它们。如果你需要增加另外的css表以支持一个动作,你可以这么做,并确保它将出现在最后被渲染的页面注:检查点现在到http:/localhost,并检查源代码。你应该可以看到你XHTML的header、head、title和body部分。创建模型和数据表在我们开始之前,让我们来思考几点:这些类将放在什么地方,我们如何找到它们?我们创建的默认的项目实例化一个自动加载(autoloader)。我们可以给它附加其他的自动加载(autoloader),所以它知道在哪里可以找到不同的类。典型的,我们想让我们各种各样的MVC类归入同一个目录树在这个例子中是application/ 并且大多数经常使用共同的前缀(common prefix)。Zend_Controller_Front 有一个“模块(modules)”概念,它是一个单独的小应用程序。模块模拟在application/目录下用zf工具建立的目录结构,且里面所有的类假定有相同的前缀模块名。“Application/”本身就是一个模块“default”或者“application”模块。因此,我们将去设置在此目录下资源的自动导入。Zend_Application_Module_Autoloader提供将模块下各种资源映射到相应目录的功能,并且也提供一个标准的命名机制。在引导对象(bootstrap object)初始化时,这个类的实例被默认创建。你的应用程序引导程序(bootstrap)将默认的使用“Application”作为模块前缀。这样,我们的模型、表单和数据表类将以“Applicatin_”为前缀。Now, lets consider what makes up a guestbook. Typically, they are simply a list of entries with a comment, timestamp, and, often, email address. Assuming we store them in a database, we may also want a unique identifier for each entry. Well likely want to be able to save an entry, fetch individual entries, and retrieve all entries. As such, a simple guestbook model API might look something like this:现在,我们来看看是什么组成了留言簿,典型的,他们简单的由评论(comment),戳(timestamp),经常还包括邮件地址的条目列表。假若将他们存储在数据库中,还要为每一个条目建立一个唯一的标识符。我们想要保存条目、查询单个条目,检索所有条目。因此,一个简单的留言薄模型API可能看起来像这样:275 / application/models/Guestbook.php276 277 class Application_Model_Guestbook278 279 protected $_comment;280 protected $_created;281 protected $_email;282 protected $_id;283 284 public function _set($name, $value);285 public function _get($name);286 287 public function setComment($text);288 public function getComment();289 290 public function setEmail($email);291 public function getEmail();292 293 public function setCreated($ts);294 public function getCreated();295 296 public function setId($id);297 public function getId();298 299 300 class Application_Model_GuestbookMapper301 302 public function save(Application_Model_Guestbook $guestbook);303 public function find($id);304 public function fetchAll();305 _get()和_set()将提供一个提供了一个便捷的机制去访问单个条目属性,代理其他的getter和setter方法(proxy to the other getters and setters),他们也帮助确保对象中只有白名单属性才是可用的Find()和fetchAll()提供获取单个条目和能力,而save()负责将条目存储到数据库。从现在开始,我们能够开始建立我们的数据库首先我们需要初始化我们的数据源。就像布局和视图资源那样,可以为数据源提供配置。我们可以使用“zf configure db-adapter”命令:306 % zf configure db-adapter 307 adapter=PDO_SQLITE&dbname=APP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年自考专业(计算机网络)自我提分评估及答案详解【有一套】
- 2024反射疗法师大赛理论常考点试卷含答案详解(黄金题型)
- 2025农村土地使用权承包转让合同范文
- 2025绿色能源采购项目购销范本合同
- 2025年版网络安全防护技术许可合同
- 2025版智能家居系统安装安全责任合同
- 2024安全员考试高分题库(能力提升)附答案详解
- 2024年黑龙江省五大连池市中考数学考试综合练习及参考答案详解(考试直接用)
- 智慧树知道网课《通信电子线路(哈尔滨工程大学)》课后章节测试满分答案
- 2025石油石化职业技能鉴定考试高频难、易错点题【易错题】附答案详解
- 机加工安全生产培训考核试题及答案(班组级)(精)
- 电梯从业证考试试题及答案解析
- 第二十四届上海市青少年计算机创新应用竞赛 python校内选拔试题及答案
- 2024年武汉商学院公开招聘辅导员笔试题含答案
- 江苏省宿迁市泗阳县2024-2025学年高二下册期末调研测试语文试题【附答案】
- 2025年《传染病防治法》综合培训试题(附答案)
- 储能电站项目实施方案
- 墙布工厂工程定制方案(3篇)
- 2025年工勤技师考试题库及答案
- 新鲜的牛肉采购合同范本
- 2025至2030年中国室内亲子游乐场行业市场评估分析及投资发展盈利预测报告
评论
0/150
提交评论