PHP开发框架Yii全方位教程1应用 Yiiapp.docx
- 文档编号:9916544
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:13
- 大小:23.36KB
PHP开发框架Yii全方位教程1应用 Yiiapp.docx
《PHP开发框架Yii全方位教程1应用 Yiiapp.docx》由会员分享,可在线阅读,更多相关《PHP开发框架Yii全方位教程1应用 Yiiapp.docx(13页珍藏版)》请在冰点文库上搜索。
PHP开发框架Yii全方位教程1应用Yiiapp
PHP开发框架Yii全方位教程
(1)应用(Yii:
:
app)
应用代表了整个请求的运行过程。
其主要任务是解析用户请求,并将其分配给相应的控制器以进行进一步的处理。
它同时也是保存应用级配置的核心。
因此,应用一般被称为“前端控制器”。
在入口脚本中,应用被创建为一个单例。
它可以在任何位置通过Yii:
:
app()来被访问。
应用配置
默认情况下,应用是CWebApplication类的一个实例。
要对其进行定制,通常是在应用实例被创建的时候提供一个配置文件(或数组)来初始化其属性值。
另一个定制应用的方法就是扩展CWebApplication类。
配置是一个键值对的数组。
每个键名都对应应用实例的一个属性,相应的值为属性的初始值。
举例来说,下面的代码设定了应用的name和defaultController属性。
array(
'name'=>'YiiFramework',
'defaultController'=>'site',
)
我们一般将配置保存在一个单独的PHP脚本中(如protected/config/main.php)。
在这个脚本中,我们按如下方式返回配置数组,
returnarray(...);
为应用这些配置,我们一般将这个文件的文件名作为一个参数,传递给应用的构造器。
或者像下述例子这样传递给Yii:
:
createWebApplication(),就像我们经常在入口脚本里做的那样:
$app=Yii:
:
createWebApplication($configFile);
如果应用配置非常复杂,我们可以将这分成几个文件,每个文件返回一部分配置参数。
接下来,我们在主配置文件里用PHP的include()把其它配置文件加载进来并合并成一个配置数组。
应用的主目录
应用的主目录是指包含所有安全系数比较高的PHP代码和数据的根目录。
在默认情况下,这个目录一般和入口脚本所在目录同级的一个子目录:
protected。
这个路径可以通过在应用配置里设置basePath属性来改变.
不应该让WEB用户访问应用文件夹里的内容。
在ApacheHTTP服务器里,我们可以在这个文件夹里放一个.htaccess文件来实现。
.htaccess的文件内容是这样的:
denyfromall
应用组件
我们可以很容易的通过组件(component)设置和丰富一个应用(Application)的功能。
一个应用可以有很多应用组件,每个组件都执行一些特定的功能。
比如说,一个应用可能通过CUrlManager和CHttpRequest组件来解析用户的访问请求。
通过配置应用的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元素加在components数组里.这个cache元素告诉我们这个组件的类是CMemCache,以及其servers属性应该如何初始化。
要调用组件,可以使用:
Yii:
:
app()->ComponentID,其中ComponentID是指这个组件的ID。
(比如Yii:
:
app()->cache).
我们可以在应用配置里,将enabled设置为false来关闭一个组件。
当我们访问一个被禁止的组件时,系统会返回一个NULL值。
默认情况下,应用组件是根据需要而创建的。
这意味着一个组件只有在被访问的情况下才会创建。
因此,系统的整体性能不会因为配置了很多组件而下降。
有些组件,(比如CLogRouter)是不管用不用都要创建的。
在这种情况下,我们在应用的配置文件里将这些组件的ID加入到应用的preload属性中。
应用的核心组件
Yii预定义了一套核心应用组件提供Web应用程序的常见功能。
例如,request组件用于解析用户请求和提供网址、cookie等信息。
几乎在每一个方面,我们都可以通过配置这些核心组件的属性,来更改Yii的默认行为。
下面我们列出CWebApplication预先声明的核心组件。
assetManager:
CAssetManager-管理发布私有asset文件。
authManager:
CAuthManager-管理基于角色控制(RBAC)。
cache:
CCache-提供数据缓存功能。
请注意,您必须指定实际的类(例如CMemCache,CDbCache)。
否则,将返回空当访问此元件。
clientScript:
CClientScript-管理客户端脚本(javascriptsandCSS)。
coreMessages:
CPhpMessageSource-提供翻译Yii框架使用的核心消息。
db:
CDbConnection-提供数据库连接。
请注意,你必须配置它的connectionString属性才能使用此元件。
errorHandler:
CErrorHandler-处理没有捕获的PHP错误和例外。
format:
CFormatter-为显示目的格式化数据值。
已自版本1.1.0可用。
messages:
CPhpMessageSource-提供翻译Yii应用程序使用的消息。
request:
CHttpRequest-提供和用户请求相关的信息。
securityManager:
CSecurityManager-提供安全相关的服务,例如散列(hashing),加密(encryption)。
session:
CHttpSession-提供会话(session)相关功能。
statePersister:
CStatePersister-提供全局持久方法(globalstatepersistencemethod)。
urlManager:
CUrlManager-提供网址解析和某些函数。
user:
CWebUser-代表当前用户的身份信息。
themeManager:
CThemeManager-管理主题(themes)。
应用的生命周期
当处理一个用户请求时,一个应用程序将经历如下生命周期:
使用CApplication:
:
preinit()预初始化应用。
建立类自动加载器和错误处理;
注册核心应用组件;
载入应用配置;
用CApplication:
:
init()初始化应用程序。
注册应用行为;
载入静态应用组件;
触发onBeginRequest事件;
处理用户请求:
解析用户请求;
创建控制器;
执行控制器;
触发onEndRequest事件;
PHP开发框架Yii教程
(2)控制器CController
控制器是CController或者其子类的实例。
控制器在用户请求应用时创建。
控制器执行所请求的action,action通常加载必要的模型并渲染恰当的视图。
最简单的action仅仅是一个控制器类方法,此方法的名字以action开始。
控制器有默认的action。
用户请求不能指定哪一个action执行时,将执行默认的action。
缺省情况下,默认的action名为index。
可以通过设置CController:
:
defaultAction改变默认的action。
下边是最小的控制器类。
因此控制器未定义任何action,请求时会抛出异常。
classSiteControllerextendsCController
{
}
路由
控制器和actions通过ID进行标识的。
控制器ID的格式:
path/to/xyz对应的类文件protected/controllers/path/to/XyzController.php,相应的xyz应该用实际的控制器名替换(例如post对应protected/controllers/PostController.php).ActionID与是没有action前缀的action方法名字。
例如,控制器类包含一个actionEdit方法,对应的actionID就是edit。
注意:
在1.0.3版本之前,控制器ID的格式是path.to.xyz而不是path/to/xyz。
用户请求一个特定的controller和action用术语即为路由.路由一个controllerID和一个actionID连结而成,二者中间以斜线分隔.例如,routepost/edit引用的是PostController和它的editaction.默认情况下,URLhttp:
//hostname/index.php?
r=post/edit将请求此controller和action.
注意:
默认地情况下,路由是大小写敏感的.从版本1.0.1开始,可以让其大小写不敏感,通过在应用配置中设置CUrlManager:
:
caseSensitive为false.当在大小写不敏感模式下,确保你遵照约定:
包含controller类文件的目录是小写的,controllermap和actionmap都使用小写的keys.
自版本1.0.3,一个应用可以包含模块(module).一个module中的controller的route格式是moduleID/controllerID/actionID.更多细节,查阅sectionaboutmodules.
控制器实例化
CWebApplication在处理一个新请求时,实例化一个控制器。
程序通过控制器的ID,并按如下规则确定控制器类及控制器类所在位置
∙若设置了CWebApplication:
:
catchAllRequest,一个基于此属性的controller将被创建,同时用户指定的controllerID将被忽略.这主要用来将application置于维护模式,并显示一个静态的提醒页面.
∙若此ID出现在CWebApplication:
:
controllerMap,对应的controller配置将被用来创建此controller实例.
∙若此ID的格式是'path/to/xyz',controller类名字被假定为XyzController而相应的类文件是protected/controllers/path/to/XyzController.php.例如,一个controllerIDadmin/user将被解析为controller类UserController,class文件是protected/controllers/admin/UserController.php.若此class文件不存在,会触发一个404CHttpException
一旦使用了modules(自版本1.0.3可用),上面的过程有少许不同.特别的,application将检查此ID是否引用的是一个module中的controller,如果是,此module实例首先被创建,然后创建controller实例.
Action
如之前所述,一个action可以被定义为一个方法,其名字以单词action开头.一个更高级的方式是定义一个action类,当它被请求的时候让controller实例化它.这将允许action可被重用,因此更加具有可重用性.
要定义一个新action类,这样做:
classUpdateActionextendsCAction
{
publicfunctionrun()
{
//placetheactionlogichere
}
}
要让controller知道此action的存在,我们重写controller类的actions()方法:
classPostControllerextendsCController
{
publicfunctionactions()
{
returnarray(
'edit'=>'application.controllers.post.UpdateAction',
);
}
}
如上所示,使用路径别名application.controllers.post.UpdateAction确定action类文件为protected/controllers/post/UpdateAction.php.
编写基于类的(class-based)action,我们可以以模块化的方式组织程序。
例如,可以使用下边的目录结构组织控制器代码:
protected/
controllers/
PostController.php
UserController.php
post/
CreateAction.php
ReadAction.php
UpdateAction.php
user/
CreateAction.php
ListAction.php
ProfileAction.php
UpdateAction.php
过滤器(Filter)
Filter是一个代码片段,被配置用来在一个控制器的动作执行之前/后执行.例如,anaccesscontrolfilter可被执行以确保在执行请求的action之前已经过验证;一个performancefilter可被用来衡量此action执行花费的时间.
一个action可有多个filter.filter以出现在filter列表中的顺序来执行.一个filter可以阻止当前action及剩余未执行的filter的执行.
一个filter可被定义为一个controller类的方法.此方法的名字必须以filter开始.例如,方法filterAccessControl的存在定义了一个名为accessControl的filter.此filter方法必须如下:
publicfunctionfilterAccessControl($filterChain)
{
//call$filterChain->run()tocontinuefilteringandactionexecution
}
$filterChain是CFilterChain的一个实例,CFilterChain代表了与被请求的action相关的filter列表.在此filter方法内部,我们可以调用$filterChain->run()以继续执行其他过滤器以及action的执行.
一个filter也可以是CFilter或其子类的一个实例.下面的代码定义了一个新的filter类:
classPerformanceFilterextendsCFilter
{
protectedfunctionpreFilter($filterChain)
{
//logicbeingappliedbeforetheactionisexecuted
returntrue;//falseiftheactionshouldnotbeexecuted
}
protectedfunctionpostFilter($filterChain)
{
//logicbeingappliedaftertheactionisexecuted
}
}
要应用filter到action,我们需要重写CController:
:
filters()方法.此方法应当返回一个filter配置数组.例如,
classPostControllerextendsCController
{
......
publicfunctionfilters()
{
returnarray(
'postOnly+edit,create',
array(
'application.filters.PerformanceFilter-edit,create',
'unit'=>'second',
),
);
}
}
上面的代码指定了两个filter:
postOnly和PerformanceFilter.postOnlyfilter是基于方法的(对应的filter方法已被定义在CController中);而PerformanceFilterfilter是基于对象的(object-based).路径别名application.filters.PerformanceFilter指定filter类文件是protected/filters/PerformanceFilter.我们使用一个数组来配置PerformanceFilter以便它可被用来初始化此filter对象的属性值.在这里PerformanceFilter的unit属性被将初始化为'second'.
使用+和-操作符,我么可以指定哪个action此filter应当和不应当被应用.在上面的例子中,postOnly被应用到edit和createaction,而PerformanceFilter被应用到所有的actions除了edit和create.若+或-均未出现在filter配置中,此filter将被用到所有action.
PHP开发框架Yii教程(3)模型CModel
模型是CModel或其子类的实例。
模型用于保持数据以及和数据相关的业务规则。
模型描述了一个单独的数据对象。
它可以是数据表中的一行数据或者用户输入的一个表单。
数据中的各个字段都描述了模型的一个属性。
这些属性都有一个标签,都可以被一套可靠的规则验证。
Yii实现了表单模型和activerecord两种模型,它们都继承自基类CModel。
表单模型是CFormModel的实例。
表单模型用于保存通过收集用户输入得来的数据。
这样的数据通常被收集,使用,然后被抛弃。
例如,在一个登录页面上,我们可以使用一个表单模型来描述诸如用户名,密码这样的由最终用户提供的信息。
若想了解更多,请参阅WorkingwithForm。
ActiveRecord(AR)是一种面向对象风格的,用于抽象数据库访问的设计模式。
任何一个AR对象都是CActiveRecord或其子类的实例,它描述的数据表中的单独一行数据。
这行数据中的字段被描述成AR对象的一个属性。
关于AR的更多信息可以在ActiveRecord中找到。
PHP开发框架Yii教程(4)视图View
视图是一个包含了主要的用户交互元素的PHP脚本。
他可以包含PHP语句,但是我们建议这些语句不要去改变数据模型,且最好能够保持其单纯性(单纯作为视图)!
为了实现逻辑和界面分离,大部分的逻辑应该被放置于控制器或模型里,而不是视图里。
一个view有一个当渲染(render)时用来识别view脚本的名字。
view名字和它的view脚本文件的名字相同。
例如:
视图edit的名称出自一个名为edit.php的脚本文件。
通过CController:
:
render()调用视图的名称可以渲染一个视图。
这个方法将在protected/views/ControllerID目录下寻找对应的视图文件。
在视图脚本内部,我们可以通过$this来访问控制器实例.我们可以在视图里以$this->propertyName的方式获取(pull)控制器的任何属性.
我们也可以用以下push的方式传递数据到视图里:
$this->render('edit',array(
'var1'=>$value1,
'var2'=>$value2,
));
在以上的方式中,render()方法将提取数组的第二个参数到变量里。
其结果是,在视图脚本里,我们可以直接访问变量$var1和$var2。
布局
布局是一种特殊的视图文件,用来修饰视图。
它通常包含了用户交互过程中常用到的一部分视图。
例如:
视图可以包含header和footer的部分,然后把内容嵌入其间。
...
phpecho$content;?
>
...
而$content则储存了内容视图的渲染结果。
当使用render()时,布局被隐含的应用。
视图脚本protected/views/layouts/main.php是默认的布局文件。
它可以通过改变CWebApplication:
:
layout或者CController:
:
layout来实现定制。
要渲染(render)一个view而不应用任何布局,换用renderPartial()。
部件
部件是CWidget或其子类的实例。
它是一个主要用于呈现目的的组件。
部件通常内嵌于一个视图来产生一些复杂却独立的用户界面。
例如,一个日历部件可以用于渲染一个复杂的日历界面。
部件可以在用户界面上更好的实现重用。
要使用一个部件在一个view脚本中这样做:
php$this->beginWidget('path.to.WidgetClass');?
>
...bodycontentthatmaybecapturedbythewidget...
php$this->endWidget();?
>
或者
php$this->widget('path.to.WidgetClass');?
>
后者用于不需要任何body内容的widget。
widget可以通过配置来定制它的行为。
这些是通过调用CBaseControl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP开发框架Yii全方位教程1应用 Yiiapp PHP 开发 框架 Yii 全方位 教程 应用