Yii框架官方教程增补篇6——基础知识:应用、组件、配置、生命周期

Yii框架官方教程增补篇6——基础知识:应用、组件、配置、生命周期

应用是指请求处理中的执行上下文。它的主要任务是分析用户请求并将其分派到合适的控制器中以作进一步处理。 它同时作为服务中心,维护应用级别的配置。鉴于此,应用也叫做前端控制器

应用由入口脚本创建为一个单例对象。这个应用单例对象可以在任何地方通过 Yii::app() 访问。

1. 应用配置

默认情况下,应用是一个 CWebApplication 的实例。要自定义它,我们通常需要提供一个配置文件 (或数组) 以创建应用实例时初始化其属性值。自定义应用的另一种方式是继承 CWebApplication。

配置是一个键值对数组。每个键代表应用实例中某属性的名字,每个值即相应属性的初始值。 例如,如下的配置设定了应用的 name 和 defaultController 属性。

array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)

我们通常在一个单独的PHP 脚本(e.g.protected/config/main.php)中保存这些配置。在脚本中, 我们通过以下方式返回此配置数组:

return array(...);

要应用此配置,我们将配置文件的名字作为参数传递给应用的构造器,或像下面这样传递到Yii::createWebApplication() 。这通常在 入口脚本 中完成:

$app=Yii::createWebApplication($configFile);

提示: 如果应用配置非常复杂,我们可以把它分割为若干文件,每个文件返回配置数组中的一部分。 然后,在主配置文件中,我们调用PHP的 include() 包含其余的配置文件并把它们合并为一个完整的配置数组。

2. 应用基础目录

应用基础目录指包含了所有安全敏感的PHP脚本和数据的根目录。默认状态下,它是一个位于含有入口脚本目录的名为protected 的子目录。它可以通过设置 application configuration 中的 basePath 属性自定义。

在应用基础目录下的内容应该保护起来防止网站访客直接访问。对于 Apache HTTP 服务器, 这可以通过在基础目录中放置一个 .htaccess 文件很简单的实现。 .htaccess 内容如下:

deny from all

3. 应用组件

应用的功能可以通过其灵活的组件结构轻易地自定义或增强。应用管理了一系列应用组件,每个组件实现一特定功能。 例如,应用通过 CUrlManager 和 CHttpRequest 的帮助解析来自用户的请求。

通过配置应用的 components 属性, 我们可以自定义应用中用到的任何组件类及其属性值。例如,我们可以配置应用的CMemCache 组件, 这样它就可以使用多个 memcache 服务器实现缓存:

array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)

如上所示,我们在 components 数组中添加了 cache 元素。cache 元素表明此组件的类是 CMemCache, 他的servers 属性应依此初始化。

要访问一个应用组件,使用 Yii::app()->ComponentID ,其中的 ComponentID 是指组件的ID(例如Yii::app()->cache)。

应用的组件可以通过在其配置中设置 enabled 为 false 禁用。当我们访问被禁用的组件时将返回 Null。

提示: 默认情况下,应用组件会按需创建。这意味着一个应用的组件如果没有在一个用户请求中被访问,它可能根本不被创建。 因此,如果一个应用配置了很多组件,其总体性能可能并不会下降。有的应用组件 (例如 CLogRouter) 可能需要在无论它们是否被访问的情况下都要被创建。 要实现这个,需将其ID列在应用的preload 属性里。

4. 核心应用组件

Yii 预定义了一系列核心应用组件,提供常见 Web 应用中所用的功能。例如, request 组件用于解析用户请求并提供例如 URL,cookie 等信息。 通过配置这些核心组件的属性,我们可以在几乎所有的方面修改Yii 的默认行为。

下面我们列出了由 CWebApplication 预定义的核心组件。

  • assetManager: CAssetManager – 管理私有资源文件的发布。

  • authManager: CAuthManager – 管理基于角色的访问控制 (RBAC).

  • cache: CCache – 提供数据缓存功能。注意,你必须指定实际的类(例如CMemCache, CDbCache)。 否则,当你访问此组件时将返回 NULL。

  • clientScript: CClientScript – 管理客户端脚本 (javascripts 和 CSS).

  • coreMessages: CPhpMessageSource – 提供 Yii 框架用到的核心信息的翻译。

  • db: CDbConnection – 提供数据库连接。注意,使用此组件你必须配置其 connectionString 属性。

  • errorHandler: CErrorHandler – 处理未捕获的 PHP 错误和异常。

  • format: CFormatter – 格式化数值显示。此功能从版本 1.1.0 起开始提供。

  • messages: CPhpMessageSource – 提供Yii应用中使用的信息翻译。

  • request: CHttpRequest – 提供关于用户请求的信息。

  • securityManager: CSecurityManager – 提供安全相关的服务,例如散列,加密。

  • session: CHttpSession – 提供session相关的功能。

  • statePersister: CStatePersister – 提供全局状态持久方法。

  • urlManager: CUrlManager – 提供 URL 解析和创建相关功能

  • user: CWebUser – 提供当前用户的识别信息。

  • themeManager: CThemeManager – 管理主题。

5. 应用的生命周期

当处理用户请求时,应用将经历如下声明周期:

  1. 通过 CApplication::preinit() 预初始化应用;

  2. 设置类的自动装载器和错误处理;

  3. 注册核心类组件;

  4. 加载应用配置;

  5. 通过 CApplication::init() 初始化应用:

  • 注册应用行为;

  • 载入静态应用组件;

触发 onBeginRequest 事件;

处理用户请求:

  • 解析用户请求;

  • 创建控制器;

  • 运行控制器;

触发 onEndRequest 事件。

yii执行流程

转载于:https://my.oschina.net/tlkt/blog/210327

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109879.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程

    用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程C语言简单实现学生成绩管理系统一、前言首先,要写一个管理系统必须要先搭出一个框架来,即明确自己要实现哪些功能,将每个功能都写陈一个函数,然后再去编写实现各个功能的函数,最后再思考各个函数之间的相互调用。如果没有先搭好框架,而是直接一上手就去写代码的话,写着写着就会有种无从下手的感觉,就像你要做一道编程题目一样,首先要做的肯定是去读题目,看题目想要让我们干什么,然后才会去写代码。其次,最…

    2022年9月2日
    5
  • java常量有哪些_Java中的常量有哪些?

    java常量有哪些_Java中的常量有哪些?JAVA常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。那么java的常量有哪些呢?在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。下面我们就一起来看看java中的这些常量。1.整型常量整型常量是整数类型的数据,有二进制、八进制、十进制和十六进制4种表示形式具体表示形式如下。二进制:由数字0和1组成的数字序列。在JDK7.0中允许使用字面值…

    2022年7月7日
    20
  • 关于sql和MySQL的语句执行顺序(必看)「建议收藏」

    关于sql和MySQL的语句执行顺序(必看)「建议收藏」今天遇到一个问题就是mysql中insertinto和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及MySQL语句执行顺序:sql和mysql执行顺序,发现内部机制是一样的。最大区别是在别名的引用上。一、sql执行顺序(1)from(3)join(2)on(4)where…

    2022年6月21日
    20
  • SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]

    SQL service基础(四)连接查询、自身连接查询、外连接查询和复合条件连接查询[通俗易懂]实验目标:1.掌握涉及一个以上数据表的查询方法。2.掌握等值连接3.掌握自然连接4.掌握非等值连接5.掌握自身连接、外连接和复合条件连接本次实验sql脚本:INSERT[dbo].[T]([TNO],[TN],[SEX],[AGE],[PROF],[SAL],[COMM],[DEPT])VALUES(N’T1′,N’李力  ‘,N’男’,…

    2022年5月6日
    71
  • ASP.NET之UpdatePanel控件

    ASP.NET之UpdatePanel控件

    2022年3月11日
    40
  • springboot连接mysql数据库测试

    springboot连接mysql数据库测试springboot连接mysql数据库pom文件依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>…

    2022年6月25日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号