yii2入口文件:Web Applications 和 Console Applications
yii框架中通常包含两类入口文件,一类是针对用户的web入口,一类是针对命令行的控制台入口。要注意两个入口的一致性,否则可能在命令行层面造成相关全局常量或函数的引用缺失。
入口文件
通常用来定义全局常量:如debug调用,当前运行环境
1
2defined('YII_DEBUG') or define('YIII_DEBUG', true);
defined('YII_DEV') or define('YII_DEV', 'dev');注册自动加载函数(composer autoloader)
1
require(__DIR__ . '/../vender/autoload.php');
加载Yii类文件
1
require(__DIR__ . '/../vender/yiisoft/yii2/yii.php');
加载应用配置
1
$config = require(__DIR__ . '/../config/web.php');
调用
yii\base\Application::run()
处理请求1
2$application = new yii\web\Application($config);
$application->run();
大致形式如下 ( 其中部分内容会在后面深入分析 )
1 | <?php |
关于Application
当入口文件创建应用时,会相应的引入相关文件,加载各种配置。下面会介绍一些相关应用的配置,及主要属性。
其中主要部分是上文实例中载入的的main.php所包含的相关属性。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41<?php
$params = array_merge(
require(__DIR__ . '/../../common/config/params.php'),
require(__DIR__ . '/../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return [
'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'urlManager'=>[
'enablePrettyUrl'=>true,
'showScriptName'=>false,
'enableStrictParsing'=>false,
'rules'=>[
'<controller:<\w+>>/<action:<\w+>>'=>'<controller>/<action>'
]
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
],
'params' => $params,
];
依据上述文件,下面将分别介绍其必备属性、很重要的属性、不重要,但也很有用的属性、应用级事件、应用生命周期图。
必备属性
id
如上所示,这里的id(最好由字母数字组成)具有绝对唯一性,主要用来区分不同应用。
basePath
basePath是指当前应用所在的根目录,可以通过文件目录(/path/to/path1)或别名形式。这里着重提一下别名形式,Yii里预定义了一个别名来代指根目录@app
,可以用它来派生其他目录,如记录程序执行日志的@app/runtime
文件目录。
很重要的属性(这里只介绍几个比较有意思的)
aliases
此属性允许我们通过配置文件以array的形式定义一个alias集合。避免在应用的到处调用Yii::setAlias()
,还方便统一管理。1
2
3
4
5
6[
'aliases' => [
'@name1' => 'path/to/path1',
'@name2' => 'path/to/path2',
],
]
catchAll
利用这个属性,我们可以在哪天需要关闭系统,但又要给用户一个页面告知用户关闭原因时,为所有请求形成一个统一的入口,指向我们的告用户界面。1
2
3
4
5
6
7[
'catchAll' => [
'offline/notice',
'param1' => 'value1',
'param2' => 'value2',
],
]
components
非常非常重要,主要用来注册一些应用组件,放在Application Components篇里详细讲解。
controllerNamespace
自从php5.3引入类似java,c++,python的命名空间的概念后,感觉真的是好用了很多,只是为了向下兼容,反斜杠/
的应用可能让人觉得有些怪诞。
回归主题,这个属性规定了controller类的默认命名空间,通过他亦可以解析子级目录下的controller,例如:某个controller ID为admin/post
, 那么解析为 app\controllers\admin\PostController
。
modules
这个属性指定了程序包含的模块(modules:一个位于已有MVC应用内,亦包含完整MVC结构的模块)。在modules章节详细分析。1
2
3
4
5
6
7
8
9
10
11
12[
'modules' => [
// a "booking" module specified with the module class
'booking' => 'app\modules\booking\BookingModule',
// a "comment" module specified with a configuration array
'comment' => [
'class' => 'app\modules\comment\CommentModule',
'db' => 'db',
],
],
]
timeZone
当配置这个属性后,应用实际上会调用PHP的内置函数date_default_timezone_set()
来设置时区。1
2
3[
'timeZone' => 'zh/Shanghai',
]
不重要,但也很有用的属性
应用级事件(全局的,顶层的,不局限于某处)
在一个请求处理周期内,应用会触发若干事件,其中会有下面四个应用级事件:
EVENT_BEFORE_REQUEST (应用处理请求之前触发的事件)
1
2
3
4
5[
'on beforeRequest' => function ($event) {
// ...
},
]EVENT_AFTER_REQUEST (应用处理请求完成后,响应发送之前,触发的事件)
1
2
3
4
5[
'on afterRequest' => function ($event) {
// ...
},
]EVENT_BEFORE_REQUEST (任何一个controller 的 action 运行之前,其参数
$event
是yii\base\ActionEvent
的一个实例)1
2
3
4
5
6
7
8[
'on beforeAction' => function ($event) {
if (some condition) {
$event->isValid = false;
} else {
}
},
]EVENT_AFTER_ACTION (任何一个controller 的 action 运行完成之后,其参数
$event
是yii\base\ActionEvent
的一个实例)1
2
3
4
5
6
7
8[
'on afterAction' => function ($event) {
if (some condition) {
$event->isValid = false;
} else {
}
},
]