应用代表了整个请求的运行过程。其主要任务是解析用户请求,并将其分配给相应的控制器以进行进一步的处理。它同时也是保存应用级配置的核心。因此,应用一般被称为“前端控制器”。
在入口脚本中,应用被创建为一个单例。它可以在任何位置通过 Yii::app() 来被访问。
应用配置
默认情况下, 应用是 CWebApplication 类的一个实例。 要对其进行定制, 通常是在应用实例被创建的时候提供一个配置文件 (或数组) 来初始化其属性值。另一个定制应用的方法就是扩展 CWebApplication 类。
配置是一个键值对的数组。 每个键名都对应应用实例的一个属性,相应的值为属性的初始值。举例来说,下面的代码设定了应用的 name 和 defaultController 属性。 我们一般将配置保存在一个单独的PHP脚本中(如protected/config/main.php)。 在这个脚本中,我们按如下方式返回配置数组, 为应用这些配置,我们一般将这个文件的文件名作为一个参数,传递给应用的构造器。或者像下述例子这样传递给Yii::createWebApplication() ,就像我们经常在入口脚本里做的那样: 如果应用配置非常复杂,我们可以将这分成几个文件,每个文件返回一部分配置参数。接下来,我们在主配置文件里用PHP 的include() 把其它配置文件加载进来并合并成一个配置数组。
应用的主目录
应用的主目录是指包含所有安全系数比较高的PHP代码和数据的根目录。在默认情况下,这个目录一般和入口脚本所在目录同级的一个子目录: protected 。这个路径可以通过在应用配置里设置 basePath属性来改变.
不应该让WEB用户访问应用文件夹里的内容。在 Apache HTTP 服务器里,我们可以在这个文件夹里放一个 .htaccess 文件来实现。.htaccess的文件内容是这样的: 应用组件
我们可以很容易的通过组件(component)设置和丰富一个应用(Application)的功能。一个应用可以有很多应用组件,每个组件都执行一些特定的功能。比如说,一个应用可能通过CUrlManager 和 CHttpRequest组件来解析用户的访问请求。
通过配置应用的 components 属性 , 我们可以为应用中的每个应用组件,配置类名及其参数。例如,我们可以配置CMemCache组件以便用服务器的内存当缓存: 在上述例子中,我们将 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预先声明的核心组件。
应用的生命周期
当处理一个用户请求时,一个应用程序将经历如下生命周期:
在入口脚本中,应用被创建为一个单例。它可以在任何位置通过 Yii::app() 来被访问。
应用配置
默认情况下, 应用是 CWebApplication 类的一个实例。 要对其进行定制, 通常是在应用实例被创建的时候提供一个配置文件 (或数组) 来初始化其属性值。另一个定制应用的方法就是扩展 CWebApplication 类。
配置是一个键值对的数组。 每个键名都对应应用实例的一个属性,相应的值为属性的初始值。举例来说,下面的代码设定了应用的 name 和 defaultController 属性。 我们一般将配置保存在一个单独的PHP脚本中(如protected/config/main.php)。 在这个脚本中,我们按如下方式返回配置数组, 为应用这些配置,我们一般将这个文件的文件名作为一个参数,传递给应用的构造器。或者像下述例子这样传递给Yii::createWebApplication() ,就像我们经常在入口脚本里做的那样: 如果应用配置非常复杂,我们可以将这分成几个文件,每个文件返回一部分配置参数。接下来,我们在主配置文件里用PHP 的include() 把其它配置文件加载进来并合并成一个配置数组。
应用的主目录
应用的主目录是指包含所有安全系数比较高的PHP代码和数据的根目录。在默认情况下,这个目录一般和入口脚本所在目录同级的一个子目录: protected 。这个路径可以通过在应用配置里设置 basePath属性来改变.
不应该让WEB用户访问应用文件夹里的内容。在 Apache HTTP 服务器里,我们可以在这个文件夹里放一个 .htaccess 文件来实现。.htaccess的文件内容是这样的: 应用组件
我们可以很容易的通过组件(component)设置和丰富一个应用(Application)的功能。一个应用可以有很多应用组件,每个组件都执行一些特定的功能。比如说,一个应用可能通过CUrlManager 和 CHttpRequest组件来解析用户的访问请求。
通过配置应用的 components 属性 , 我们可以为应用中的每个应用组件,配置类名及其参数。例如,我们可以配置CMemCache组件以便用服务器的内存当缓存: 在上述例子中,我们将 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 -管理客户端脚本(javascripts and CSS)。
- 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 -提供全局持久方法(global state persistence method)。
- urlManager: CUrlManager - 提供网址解析和某些函数。
- user: CWebUser - 代表当前用户的身份信息。
- themeManager: CThemeManager - 管理主题(themes)。
应用的生命周期
当处理一个用户请求时,一个应用程序将经历如下生命周期:
- 使用 CApplication::preinit() 预初始化应用。
- 建立类自动加载器和错误处理;
- 注册核心应用组件;
- 载入应用配置;
- 用CApplication::init()初始化应用程序。
- 注册应用行为;
- 载入静态应用组件;
- 触发onBeginRequest事件;
- 处理用户请求:
- 解析用户请求;
- 创建控制器;
- 执行控制器;
- 触发onEndRequest事件;