basic/                  应用根目录
composer.json Composer 配置文件, 描述包信息
config/ 包含应用配置及其它配置
console.php 控制台应用配置信息
web.php Web 应用配置信息
commands/ 包含控制台命令类
controllers/ 包含控制器类
models/ 包含模型类
runtime/ 包含 Yii 在运行时生成的文件,例如日志和缓存文件
vendor/ 包含已经安装的 Composer 包,包括 Yii 框架自身
views/ 包含视图文
web/ Web 应用根目录,包含 Web 入口文件
assets/ 包含 Yii 发布的资源文件(javascript 和 css)
index.php 应用入口文件
yii Yii 控制台命令执行脚本

入口脚本

入口脚本是应用启动流程中的第一环, 一个应用(不管是网页应用还是控制台应用)只有一个入口脚本。

终端用户的请求通过入口脚本实例化应用并将将请求转发到应用。

Web 应用的入口脚本必须放在终端用户能够访问的目录下, 通常命名为 index.php

控制台应用的入口脚本一般在应用根目录下命名为 yii(后缀为.php), 该文件需要有执行权限, 这样用户就能通过命令 ./yii <route> [arguments] [options] 来运行控制台应用。

入口脚本主要完成以下工作:

  • 定义全局常量;
  • 注册 Composer 自动加载器
  • 包含 Yii 类文件;
  • 加载应用配置;
  • 创建一个应用实例并配置;
  • 调用 yii\base\Application::run() 来处理请求

WEB应用下面是入口脚本的代码

<?php

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev'); // 注册 Composer 自动加载器
require(__DIR__ . '/../vendor/autoload.php');
// 包含 Yii 类文件
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); // 加载应用配置
$config = require(__DIR__ . '/../config/web.php'); // 创建、配置、运行一个应用
(new yii\web\Application($config))->run();

  

控制台应用

以下是一个控制台应用的入口脚本:

#!/usr/bin/env php
<?php
/**
* Yii console bootstrap file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/ defined('YII_DEBUG') or define('YII_DEBUG', true); // 注册 Composer 自动加载器
require(__DIR__ . '/vendor/autoload.php'); // 包含 Yii 类文件
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php'); // 加载应用配置
$config = require(__DIR__ . '/config/console.php'); $application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);

  

定义常量

入口脚本是定义全局常量的最好地方,Yii 支持以下三个常量:

  • YII_DEBUG:标识应用是否运行在调试模式。当在调试模式下, 应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈。 因此,调试模式主要适合在开发阶段使用,YII_DEBUG 默认值为 false。
  • YII_ENV:标识应用运行的环境, 详情请查阅配置章节。 YII_ENV 默认值为 'prod',表示应用运行在线上产品环境。
  • YII_ENABLE_ERROR_HANDLER:标识是否启用 Yii 提供的错误处理, 默认为 true。

当定义一个常量时,通常使用类似如下代码来定义:

defined('YII_DEBUG') or define('YII_DEBUG', true);

上面的代码等同于:

if (!defined('YII_DEBUG')) {
define('YII_DEBUG', true);
}

显然第一段代码更加简洁易懂。

常量定义应该在入口脚本的开头,这样包含其他 PHP 文件时, 常量就能生效。

类自动加载(Autoloading)

Yii 依靠类自动加载机制来定位和包含所需的类文件。

它提供一个高性能且完美支持PSR-4 标准 (中文汉化)的自动加载器。

该自动加载器会在引入框架文件 Yii.php 时安装好。

注意:为了简化叙述,本篇文档中我们只会提及类的自动加载。 不过,要记得文中的描述同样也适用于接口和Trait(特质)的自动加载哦。

使用 Yii 自动加载器 要使用 Yii 的类自动加载器

你需要在创建和命名类的时候遵循两个简单的规则:

  1. 每个类都必须置于命名空间之下 (比如 foo\bar\MyClass)。
  2. 每个类都必须保存为单独文件,且其完整路径能用以下算法取得:

// $className 是一个开头包含反斜杠的完整类名(译注:请自行谷歌:fully qualified class name)

$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');把\\更新成/

举例来说,若某个类名为 foo\bar\MyClass,对应类的文件路径别名会是 @foo/bar/MyClass.php

为了让该别名能被正确解析为文件路径,@foo 或 @foo/bar 中的一个必须是根别名

当我们使用基本应用模版时,可以把你的类放置在顶级命名空间 app 下, 这样它们就可以被 Yii 自动加载,而无需定义一个新的别名。

这是因为 @app 本身是一个预定义别名且类似于 app\components\MyClass 这样的类名, 基于我们刚才所提到的算法,可以正确解析出 AppBasePath/components/MyClass.php 路径。

类映射表(Class Map)

Yii 类自动加载器支持类映射表功能,该功能会建立一个从类的名字到类文件路径的映射。

当自动加载器加载一个文件时,他首先检查映射表里有没有该类。

如果有,对应的文件路径就直接加载了,省掉了进一步的检查。

这让类的自动加载变得超级快。事实上所有的 Yii 核心类都是这样加载的。

你可以用 Yii::$classMap 方法向映射表中添加类,

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

别名可以被用于指定类文件的路径。

你应该在引导启动的过程中设置类映射表,这样映射表就可以在你使用具体类之前就准备好。

用其他自动加载器

因为 Yii 完全支持 Composer 管理依赖包, 所以推荐你也同时安装 Composer 的自动加载器,如果你用了一些自带自动加载器的第三方类库, 你应该也安装下它们。

当你同时使用其他自动加载器和 Yii 自动加载器时,应该在其他自动加载器安装成功之后,再包含 Yii.php 文件。

这将使 Yii 成为第一个响应任何类自动加载请求的自动加载器。

举例来说,以下代码提取自基本应用模版入口脚本 。

第一行安装了 Composer 的自动加载器, 第二行才是 Yii 的自动加载器:

//注册
require(__DIR__ . '/../vendor/autoload.php');
//包含
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

你也可以只使用 Composer 的自动加载,而不用 Yii 的自动加载。 不过这样做的话,类的加载效率会下降,且你必须遵循 Composer 所设定的规则, 从而让你的类满足可以被自动加载的要求。

补充:若你不想要使用 Yii 的自动加载器,你必须创建一个你自己版本的 Yii.php 文件, 并把它包含进你的入口脚本里。

自动加载扩展类

Yii 自动加载器支持自动加载扩展的类。唯一的要求是它需要在 composer.json 文件里正确地定义 autoload 部分。请参考 Composer 文档(英文) (中文汉化),来了解如何正确描述 autoload 的更多细节。

在你不使用 Yii 的自动加载器时,Composer 的自动加载器仍然可以帮你自动加载扩展内的类。

Yii关键概念的更多相关文章

  1. Kafka学习之(一)了解一下Kafka及关键概念和处理机制

    Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模小打的网站中所有动作流数据.优势 高吞吐量:非常普通的硬件Kafka也可以支持每秒100W的消息,即使在非常廉价的商用机器上也能做 ...

  2. Docker关键概念阐述

    要了解Docker需要对其体系结构中的几个关键概念有所了解,主要包括image.container.service.swarm.stack等. 在介绍这几个概念时,会使用到一个测试环境,这个测试环境是 ...

  3. 【NS-3学习】ns3-模拟基础:关键概念,日志,命令行参数

    前言 本篇博客先介绍在仿真过程中会使用到的一些关键概念,然后介绍便于调试仿真脚本的常用技术:日志.命令行参数. 关键概念 节点 在因特网术语中,主机(终端)是指任何一台连接到网络的计算设备.ns-3并 ...

  4. Libra教程之:Libra协议的关键概念

    文章目录 Libra协议 交易和状态 交易详解 账本状态详解 版本数据库 账户 账户地址 Proof 验证节点 存储 Libra协议 Libra协议是Libra区块链的基础,本文主要讲解Libra协议 ...

  5. DotNetty关键概念及简单示例(基于NET5)

    DotNetty关键概念及简单示例(基于NET5) 目录 DotNetty关键概念及简单示例(基于NET5) 1.DotNetty 设计的关键 1.1 核心组件 1.1.1 Channel 1.1.2 ...

  6. YII框架概念与安装

    Yii概念: YII安装:      下载最版本http://www.framework.com      解压至访问目录下 直接打开advanced/init.bat文件输入0之后输入yes 打不开 ...

  7. Drools Fusion (CEP) Example 和 关键概念

    Drools Fusion (Complex Event Processing) 是Drools对于复杂事件处理的模块, 与它功能相似的是Esper, 两者都可以提供基于时间跨度和滑动窗口的事件处理, ...

  8. Elasticsearch 的一些关键概念

    我更喜欢把 Elasticsearch 作为一种 nosql 去理解,它的一些开发概念和 MongoDB 以及 Redis 没有太大的区别,不过了解 Elasticsearch 中的一些核心概念对于你 ...

  9. ElasticSearch关键概念

    Elasticsearch 添加索引 一个存储关联数据的地方 用来指向一个或者多个分片(shards)的逻辑命名空间(logical namespcase) 应用程序直接与索引通信 一个分片(shar ...

随机推荐

  1. exports和module.exports区别

    参考:module.exports与exports的区别.关于exports的总结 exports 和 module.exports 的区别 module.exports是真正的模块接口,而expor ...

  2. img通过canvas转成base64编码

    <script type="text/javascript"> function getBase64Image(img) { var canvas = document ...

  3. xcode7/ios9中 低版本app运行时,屏幕上下出现黑边的问题

    xcode从低版本升级至 7.0或更高版本后,某些低版本app再次编译运行后,发现app在设备上运行时,会在上端和底部 出现黑边的现象.这导致app的展示界面跟缩水了一样,变得十分丑陋. 对于这一问题 ...

  4. 【 Android】使手机屏幕常亮,不进入待机状态

    Android中,申请WakeLock可以让你的进程持续执行即使手机进入睡眠模式,比较实用的是比如后台有网络功能,可以保证操作持续进行. 需要权限 <uses-permission androi ...

  5. 网络费用流-最小k路径覆盖

    多校联赛第一场(hdu4862) Jump Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. Javaweb程序打包或exe执行文件

    java程序的打包与发布 这里主要是讲解一下怎样将 Java程序打包成独立运行的exe程序包,以下这种方法应该是最佳的解决方案了.NetDuke的EXE程序包了是使用这种方案制作的.在操作步骤上还是比 ...

  7. 洛谷P1613 跑路 图论

    正解:倍增+图论 解题报告: 传送门! 话说这题是真滴很妙啊,,,大概港下QwQ 首先看懂这道题,它是说,只要是1<<k的都能1s跑过,而且每条边的长度都是1,就是说一秒可以跑过1< ...

  8. [原创]chromium源码阅读-进程间通信IPC.消息的接收与应答

    chromium源码阅读-进程间通信IPC.消息的接收与应答   chromium源码阅读-进程间通信IPC.消息的接收与应答 介绍 chromium进程间通信在win32下是通过命名管道的方式实现的 ...

  9. JS&CSS压缩工具YUICompressor

    YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发. YUI Compressor下载地址:http://www.jb51.net/softs/25860.h ...

  10. centos LAMP第四部分mysql操作 忘记root密码 skip-innodb 配置慢查询日志 mysql常用操作 mysql常用操作 mysql备份与恢复 第二十二节课

    centos  LAMP第四部分mysql操作  忘记root密码  skip-innodb 配置慢查询日志 mysql常用操作  mysql常用操作 mysql备份与恢复   第二十二节课 mysq ...