《2022年PHP开发框架Yii全方位教程应用 .pdf》由会员分享,可在线阅读,更多相关《2022年PHP开发框架Yii全方位教程应用 .pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PHP开发框架 Yii 全方位教程 (1) 应用 (Yii:app) 应用代表了整个请求的运行过程。其主要任务是解析用户请求, 并将其分配给相应的控制器以进行进一步的处理。它同时也是保存应用级配置的核心。因此,应用一般被称为“前端控制器”。在入口脚本中, 应用被创建为一个单例。 它可以在任何位置通过 Yii:app() 来被访问。应用配置默认情况下,应用是 CWebApplication 类的一个实例。要对其进行定制,通常是在应用实例被创建的时候提供一个配置文件 ( 或数组 ) 来初始化其属性值。另一个定制应用的方法就是扩展 CWebApplication 类。配置是一个键值对的数组。每个键名
2、都对应应用实例的一个属性,相应的值为属性的初始值。举例来说,下面的代码设定了应用的 name 和defaultController 属性。array( name=Yii Framework, defaultController=site, ) 我们一般将配置保存在一个单独的PHP脚本中 (如protected/config/main.php)。 在这个脚本中, 我们按如下方式返回配置数组,return array(.); 为应用这些配置, 我们一般将这个文件的文件名作为一个参数,传递给应用的构造器。或者像下述例子这样传递给Yii:createWebApplication() ,就像我们经常在入
3、口脚本里做的那样: $app=Yii:createWebApplication($configFile); 如果应用配置非常复杂, 我们可以将这分成几个文件, 每个文件返回一部分配置参数。接下来,我们在主配置文件里用PHP 的 include() 把其它配置文件加载进来并合并成一个配置数组。应用的主目录应用的主目录是指包含所有安全系数比较高的PHP 代码和数据的根目录。 在默认情况下,这个目录一般和入口脚本所在目录同级的一个子目录: protected 。这个路径可以通过在应用配置里设置 basePath 属性来改变 . 名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
4、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 不应该让 WEB 用户访问应用文件夹里的内容。在 Apache HTTP 服务器里,我们可以在这个文件夹里放一个 .htaccess 文件来实现。 .htaccess的文件内容是这样的:deny from all 应用组件我们可以很容易的通过组件(component) 设置和丰富一个应用 (Application)的功能。一个应用可以有很多应用组件,每个组件都执行一些特定的功能。比如说, 一个应用可能通过CUrlManager 和 CHttpRequ
5、est 组件来解析用户的访问请求。通过配置应用的 components 属性 , 我们可以为应用中的每个应用组件,配置类名及其参数。例如, 我们可以配置 CMemCache 组件以便用服务器的内存当缓存:array( . components=array( . cache=array( class=CMemCache, servers=array( array(host=server1, port=11211, weight=60), array(host=server2, port=11211, weight=40), ), ), ), ) 在上述例子中,我们将 cache 元素加在 com
6、ponents 数组里 . 这个 cache 元素告诉我们这个组件的类是 CMemCache ,以及其 servers 属性应该如何初始化。要调用组件,可以使用:Yii:app()-ComponentID,其中 ComponentID是指这个组件的 ID。 ( 比如 Yii:app()-cache). 我们可以在应用配置里,将 enabled 设置为 false来关闭一个组件。当我们访问一个被禁止的组件时,系统会返回一个NULL值。默认情况下, 应用组件是根据需要而创建的。这意味着一个组件只有在被访问的情况下才会创建。因此,系统的整体性能不会因为配置了很多组件而下降。有些组件, ( 比如 CL
7、ogRouter) 是不管用不用都要创建的。在这种情况下,我们在应用的配置文件里将这些组件的ID 加入到应用的 preload 属性中。应用的核心组件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - Yii 预定义了一套核心应用组件提供Web应用程序的常见功能。例如,request组件用于解析用户请求和提供网址、cookie 等信息。几乎在每一个方面,我们都可以通过配置这些核心组件的属性,来更改Yii 的默认行为。下面我们列出
8、CWebApplication 预先声明的核心组件。assetManager: CAssetManager -管理发布私有 asset 文件。authManager: CAuthManager - 管理基于角色控制 (RBAC)。cache: CCache - 提供数据缓存功能。请注意,您必须指定实际的类(例如CMemCache, CDbCache ) 。否则,将返回空当访问此元件。clientScript: CClientScript -管理客户端脚本 (javascripts and CSS)。coreMessages: CPhpMessageSource - 提供翻译 Yii 框架使用的
9、核心消息。db: CDbConnection - 提供数据库连接。请注意,你必须配置它的connectionString属性才能使用此元件。errorHandler: CErrorHandler - 处理没有捕获的PHP 错误和例外。format: CFormatter - 为显示目的格式化数据值。已自版本 1.1.0 可用。messages: CPhpMessageSource - 提供翻译 Yii 应用程序使用的消息。request: CHttpRequest - 提供和用户请求相关的信息。securityManager: CSecurityManager -提供安全相关的服务,例如散列(
10、hashing ), 加密( encryption )。session: CHttpSession - 提供会话( session )相关功能。statePersister: CStatePersister -提供全局持久方法( global state persistence method)。urlManager: CUrlManager - 提供网址解析和某些函数。user: CWebUser - 代表当前用户的身份信息。themeManager: CThemeManager - 管理主题( themes)。应用的生命周期名师资料总结 - - -精品资料欢迎下载 - - - - - - -
11、 - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 当处理一个用户请求时,一个应用程序将经历如下生命周期:使用 CApplication:preinit() 预初始化应用。建立类自动加载器和错误处理;注册核心应用组件;载入应用配置;用 CApplication:init()初始化应用程序。注册应用行为;载入静态应用组件;触发 onBeginRequest 事件; 处理用户请求:解析用户请求;创建控制器;执行控制器;触发 onEndRequest事件; PHP开发框架 Yii 教程(2) 控制器 C
12、Controller 控制器是 CController 或者其子类的实例。控制器在用户请求应用时创建。控制器执行所请求的action ,action通常加载必要的模型并渲染恰当的视图。最简单的 action仅仅是一个控制器类方法,此方法的名字以action 开始。控制器有默认的 action 。用户请求不能指定哪一个action执行时,将执行默认的 action 。缺省情况下 , 默认的 action名为 index 。可以通过设置CController:defaultAction改变默认的 action 。下边是最小的控制器类。因此控制器未定义任何action,请求时会抛出异常。class
13、SiteController extends CController 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 路由控制器和 actions通过 ID 进行标识的。控制器ID 的格式: path/to/xyz对应的类文件 protected/controllers/path/to/XyzController.php, 相应的 xyz应该用实际的控制器名替换 ( 例如 post 对应protected/controller
14、s/PostController.php). Action ID与 是没有 action前缀的 action方法名字。例如,控制器类包含一个 actionEdit 方法, 对应的action ID就是 edit 。注意: 在 1.0.3 版本之前 , 控制器 ID 的格式是 path.to.xyz 而不是path/to/xyz。用户请求一个特定的 controller 和 action 用术语即为路由. 路由一个controller ID 和一个 action ID 连结而成 , 二者中间以斜线分隔 . 例如, route post/edit 引用的是 PostController 和它的 e
15、dit action. 默认情况下 , URL http:/hostname/index.php?r=post/edit 将请求此 controller 和action. 注意: 默认地情况下,路由是大小写敏感的. 从版本 1.0.1 开始, 可以让其大小写不敏感 , 通过在应用配置中设置 CUrlManager:caseSensitive 为false . 当在大小写不敏感模式下, 确保你遵照约定: 包含 controller 类文件的目录是小写的 , controller map 和 action map 都使用小写的 keys. 自版本 1.0.3, 一个应用可以包含模块( module
16、). 一个 module 中的controller 的 route 格式是 moduleID/controllerID/actionID. 更多细节 , 查阅 section about modules. 控制器实例化CWebApplication 在处理一个新请求时,实例化一个控制器。程序通过控制器的ID,并按如下规则确定控制器类及控制器类所在位置若设置了 CWebApplication:catchAllRequest, 一个基于此属性的controller 将被创建 , 同时用户指定的 controller ID 将被忽略 . 这主要用来将 application 置于维护模式 , 并显示
17、一个静态的提醒页面. 若此 ID 出现在 CWebApplication:controllerMap, 对应的controller 配置将被用来创建此 controller 实例. 若此 ID 的格式是 path/to/xyz, controller 类名字被假定为XyzController 而相应的类文件是protected/controllers/path/to/XyzController.php. 例如, 一个名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页
18、 - - - - - - - - - controller ID admin/user 将被解析为 controller 类UserController ,class 文件是protected/controllers/admin/UserController.php. 若此 class 文件不存在 , 会触发一个 404 CHttpException 一旦 使用了 modules ( 自版本 1.0.3 可用), 上面的过程有少许不同 . 特别的 , application 将检查此 ID 是否引用的是一个 module 中的 controller, 如果是, 此 module 实例首先被创建
19、 , 然后创建 controller 实例. Action如之前所述 , 一个 action 可以被定义为一个方法 , 其名字以单词 action 开头. 一个更高级的方式是定义一个 action 类, 当它被请求的时候让 controller 实例化它 . 这将允许 action 可被重用 , 因此更加具有可重用性 . 要定义一个新 action 类, 这样做 : class UpdateAction extends CAction public function run() / place the action logic here 要让 controller 知道此 action 的存在
20、 , 我们重写 controller 类的actions() 方法: class PostController extends CController public function actions() return array( edit=application.controllers.post.UpdateAction, ); 如上所示,使用路径别名application.controllers.post.UpdateAction 确定action类文件为 protected/controllers/post/UpdateAction.php. 编写基于类的 (class-based) a
21、ction, 我们可以以模块化的方式组织程序。例如,可以使用下边的目录结构组织控制器代码: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - protected/ controllers/ PostController.php UserController.php post/ CreateAction.php ReadAction.php UpdateAction.php user/ CreateAction.php ListA
22、ction.php ProfileAction.php UpdateAction.php 过滤器 (Filter) Filter 是一个代码片段 , 被配置用来在一个控制器的动作执行之前/ 后执行 . 例如, an access control filter 可被执行以确保在执行请求的 action 之前已经过验证 ; 一个 performance filter 可被用来衡量此 action 执行花费的时间. 一个 action 可有多个 filter. filter 以出现在 filter 列表中的顺序来执行. 一个 filter 可以阻止当前 action 及剩余未执行的 filter 的
23、执行 . 一个 filter 可被定义为一个 controller 类的方法 . 此方法的名字必须以filter 开始. 例如, 方法 filterAccessControl 的存在定义了一个名为accessControl 的 filter. 此 filter 方法必须如下 : public function filterAccessControl($filterChain) / call $filterChain-run() to continue filtering and action execution $filterChain 是 CFilterChain 的一个实例 , CFilt
24、erChain 代表了与被请求的 action 相关的 filter 列表. 在此 filter 方法内部 , 我们可以调用$filterChain-run() 以继续 执行其他过滤器以及 action 的执行 . 一个 filter 也可以是 CFilter 或其子类的一个实例 . 下面的代码定义了一个新的 filter 类: class PerformanceFilter extends CFilter protected function preFilter($filterChain) / logic being applied before the action is executed
25、 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - return true; / false if the action should not be executed protected function postFilter($filterChain) / logic being applied after the action is executed 要应用 filter 到 action, 我们需要重写 CControll
26、er:filters() 方法. 此方法应当返回一个 filter 配置数组 . 例如, class PostController extends CController . public function filters() return array( postOnly + edit, create, array( application.filters.PerformanceFilter - edit, create, unit=second, ), ); 上面的代码指定了两个 filter: postOnly 和 PerformanceFilter. postOnly filter 是基
27、于方法的 ( 对应的 filter 方法已被定义在 CController 中); 而PerformanceFilter filter 是基于对象的 (object-based). 路径别名application.filters.PerformanceFilter 指定 filter 类文件是protected/filters/PerformanceFilter. 我们使用一个数组来配置PerformanceFilter 以便它可被用来初始化此 filter 对象的属性值 . 在这里PerformanceFilter 的 unit 属性被将初始化为 second. 使用+和- 操作符 , 我么
28、可以指定哪个 action 此 filter 应当和不应当被应用 . 在上面的例子中 , postOnly 被应用到 edit 和 create action, 而PerformanceFilter 被应用到所有的 actions 除了 edit和 create. 若+或-均未出现在 filter 配置中 , 此 filter 将被用到所有 action . PHP开发框架 Yii 教程(3) 模型 CModel 模型是CModel 或其子类的实例。模型用于保持数据以及和数据相关的业务规则。模型描述了一个单独的数据对象。它可以是数据表中的一行数据或者用户输入的一个表单。名师资料总结 - - -
29、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 数据中的各个字段都描述了模型的一个属性。这些属性都有一个标签,都可以被一套可靠的规则验证。Yii 实现了表单模型和active record 两种模型,它们都继承自基类CModel。表单模型是CFormModel 的实例。 表单模型用于保存通过收集用户输入得来的数据。这样的数据通常被收集,使用,然后被抛弃。例如,在一个登录页面上,我们可以使用一个表单模型来描述诸如用户名,密码这样的由最终用户提供的信息。
30、若想了解更多, 请参阅Working with Form 。Active Record (AR) 是一种面向对象风格的,用于抽象数据库访问的设计模式。任何一个AR 对象都是CActiveRecord 或其子类的实例,它描述的数据表中的单独一行数据。这行数据中的字段被描述成AR 对象的一个属性。关于AR 的更多信息可以在Active Record 中找到。PHP开发框架 Yii 教程(4) 视图 View 视图是一个包含了主要的用户交互元素的PHP脚本。他可以包含 PHP语句,但是我们建议这些语句不要去改变数据模型,且最好能够保持其单纯性( 单纯作为视图)! 为了实现逻辑和界面分离, 大部分的逻
31、辑应该被放置于控制器或模型里,而不是视图里。一个 view 有一个当渲染 (render) 时用来识别 view 脚本的名字。 view 名字和它的 view 脚本文件的名字相同。例如: 视图 edit 的名称出自一个名为edit.php 的脚本文件。通过 CController:render() 调用视图的名称可以渲染一个视图。这个方法将在 protected/views/ControllerID 目录下寻找对应的视图文件。在视图脚本内部,我们可以通过 $this 来访问控制器实例 . 我们可以在视图里以$this-propertyName 的方式获取( pull )控制器的任何属性 . 我
32、们也可以用以下 push 的方式传递数据到视图里 : $this-render(edit, array( var1=$value1, var2=$value2, ); 在以上的方式中, render() 方法将提取数组的第二个参数到变量里。其结果是,在视图脚本里,我们可以直接访问变量 $var1 和 $var2 。布局布局是一种特殊的视图文件, 用来修饰视图。 它通常包含了用户交互过程中常用名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - -
33、- - - 到的一部分视图。例如 : 视图可以包含 header 和 footer的部分,然后把内容嵌入其间。. . 而 $content 则储存了内容视图的渲染结果。当使用 render() 时,布局被隐含的应用。视图脚本protected/views/layouts/main.php 是默认的布局文件。它可以通过改变CWebApplication:layout 或者 CController:layout 来实现定制。要渲染(render) 一个 view 而不应用任何布局,换用 renderPartial()。部件部件 是 CWidget 或其子类的实例。 它是一个主要用于呈现目的的组件。
34、部件通常内嵌于一个视图来产生一些复杂却独立的用户界面。例如,一个日历部件可以用于渲染一个复杂的日历界面。部件可以在用户界面上更好的实现重用。要使用一个部件在一个 view 脚本中这样做 : beginWidget(path.to.WidgetClass); ? .body content that may be captured by the widget. endWidget(); ? 或者widget(path.to.WidgetClass); ? 后者用于不需要任何 body 内容的 widget 。widget 可以通过配置来定制它的行为。这些是通过调用CBaseController:
35、beginWidget 或者 CBaseController:widget 设置它们的初始化属性值来完成的。 例如,当使用 CMaskedTextField 组件时,我们想指定被使用的 mask 。我们通过传递一个携带这些属性初始化值的数组来实现。这里的数组的键是属性的名称, 而数组的值则是组件属性所对应的值。正如以下所示:widget(CMaskedTextField,array( mask=99/99/9999 ); ? 继承部件以及重载它的init() 和 run() 方法,可以定义一个新的组件: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
36、- - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - class MyWidget extends CWidget public function init() / this method is called by CController:beginWidget() public function run() / this method is called by CController:endWidget() 部件可以像一个控制器一样拥有它自己的视图。默认的, widget 的视图文件位于包含了 widget 文件的
37、views 子目录之下。这些视图可以通过调用CWidget:render() 渲染,这一点和控制器很相似。唯一不同的是,widget 的视图没有布局文件支持。 同时,view 文件中的 $this 指的是 widget 实例而不是 controller 实例。系统视图 (System View)系统视图的渲染通常用于展示 Yii 的错误和日志信息。例如,当用户请求来一个不存在的控制器或动作时, Yii 会抛出一个异常来解释这个错误。 这时, Yii 就会使用一个特殊的系统视图来展示这个错误。系统视图的命名遵从了一些规则。 比如像 errorXXX 这样的名称就是用于渲染展示错误号 XXX 的 CHttpException 的视图。例如,如果 CHttpException 抛出来一个 404 错误,那么 error404 就会被展示出来。在 framework/views 下,Yii 提供了一系列默认的系统视图。他们可以通过在protected/views/system 下创建同名视图文件来实现定制。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -
限制150内