Yii 框架应用(Applications)操作实例详解
本文实例讲述了yii 框架应用(applications)操作。分享给大家供大家参考,具体如下:
应用主体
应用主体是管理 yii 应用系统整体结构和生命周期的对象。 每个yii应用系统只能包含一个应用主体,应用主体在 中创建并能通过表达式 \yii::$app
全局范围内访问。
信息: 当我们说"一个应用",它可能是一个应用主体对象,也可能是一个应用系统, 是根据上下文来决定[译:中文为避免歧义,application翻译为应用主体]。
yii有两种应用主体: and , 如名称所示,前者主要处理网页请求,后者处理控制台请求。
应用主体配置
如下所示,当 创建了一个应用主体, 它会加载一个 文件并传给应用主体。
require __dir__ . '/../vendor/autoload.php'; require __dir__ . '/../vendor/yiisoft/yii2/yii.php'; // 加载应用主体配置 $config = require __dir__ . '/../config/web.php'; // 实例化应用主体、配置应用主体 (new yii\web\application($config))->run();
类似其他 文件, 应用主体配置文件标明如何设置应用对象初始属性。 由于应用主体配置比较复杂,一般保存在多个类似如上web.php的 当中。
应用主体属性
应用主体配置文件中有许多重要的属性要配置,这些属性指定应用主体的运行环境。 比如,应用主体需要知道如何加载 , 临时文件保存到哪儿等等。 以下我们简述这些属性。
必要属性
在一个应用中,至少要配置2个属性: 和 basepath。
属性用来区分其他应用的唯一标识id。主要给程序使用。 为了方便协作,最好使用数字作为应用主体id, 但不强制要求为数字。
basepath 指定该应用的根目录。 根目录包含应用系统所有受保护的源代码。 在根目录下可以看到对应mvc设计模式的models
, views
, controllers
等子目录。
可以使用路径或 来在配置 basepath 属性。 两种格式所对应的目录都必须存在,否则系统会抛出一个异常。 系统会使用 realpath()
函数规范化配置的路径.
basepath 属性经常用于派生一些其他重要路径(如runtime路径), 因此,系统预定义 @app
代表这个路径。 派生路径可以通过这个别名组成(如@app/runtime
代表runtime的路径)。
重要属性
本小节所描述的属性通常需要设置, 因为不同的应用属性不同。
该属性允许你用一个数组定义多个 。 数组的key为别名名称,值为对应的路径。 例如:
[ 'aliases' => [ '@name1' => 'path/to/path1', '@name2' => 'path/to/path2', ], ]
使用这个属性来定义别名, 代替 yii::setalias() 方法来设置。
这个属性很实用,它允许你用数组指定启动阶段 需要运行的组件。 比如,如果你希望一个 自定义 url 规则, 你可以将模块id加入到bootstrap数组中。
属性中的每个组件需要指定以下一项:
- 应用 id.
- id.
- 类名.
- 配置数组.
- 创建并返回一个组件的无名称函数.
例如:
[ 'bootstrap' => [ // 应用组件id或模块id 'demo', // 类名 'app\components\profiler', // 配置数组 [ 'class' => 'app\components\profiler', 'level' => 3, ], // 匿名函数 function () { return new app\components\profiler(); } ], ]
信息: 如果模块 id 和应用组件 id 同名,优先使用应用组件 id, 如果你想用模块 id, 可以使用如下无名称函数返回模块 id。
[ function () { return yii::$app->getmodule('user'); }, ]
在启动阶段,每个组件都会实例化。如果组件类实现接口 yii\base\bootstrapinterface,也会调用 方法。
举一个实际的例子,basic application template 应用主体配置中, 开发环境下会在启动阶段运行 debug
和 gii
模块。
if (yii_env_dev) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = 'yii\debug\module'; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = 'yii\gii\module'; }
注意: 启动太多的组件会降低系统性能,因为每次请求都需要重新运行启动组件, 因此谨慎配置启动组件。
该属性仅 web applications 网页应用支持。 它指定一个要处理所有用户请求的 , 通常在维护模式下使用,同一个方法处理所有用户请求。
该配置为一个数组,第一项指定动作的路由,剩下的数组项(key-value 成对)指定传递给动作的参数, 例如:
[ 'catchall' => [ 'offline/notice', 'param1' => 'value1', 'param2' => 'value2', ], ]
信息: 当开启这个属性时,开发环境下的调试面板将不能工作。
这是最重要的属性,它允许你注册多个在其他地方使用的 . 例如
[ 'components' => [ 'cache' => [ 'class' => 'yii\caching\filecache', ], 'user' => [ 'identityclass' => 'app\models\user', 'enableautologin' => true, ], ], ]
每一个应用组件指定一个key-value对的数组,key代表组件id, value代表组件类名或 。
在应用中可以任意注册组件,并可以通过表达式 \yii::$app->componentid
全局访问。
该属性允许你指定一个控制器id到任意控制器类。 yii遵循一个默认的 规则 指定控制器id到任意控制器类(如post
对应app\controllers\postcontroller
)。 通过配置这个属性,可以打破这个默认规则,在下面的例子中, account
对应到app\controllers\usercontroller
, article
对应到 app\controllers\postcontroller
。
[ 'controllermap' => [ 'account' => 'app\controllers\usercontroller', 'article' => [ 'class' => 'app\controllers\postcontroller', 'enablecsrfvalidation' => false, ], ], ]
数组的键代表控制器id, 数组的值代表对应的类名。
该属性指定控制器类默认的命名空间,默认为app\controllers
。 比如控制器id为 post
默认对应 postcontroller
(不带命名空间), 类全名为 app\controllers\postcontroller
。
控制器类文件可能放在这个命名空间对应目录的子目录下, 例如,控制器id admin/post
对应的控制器类全名为 app\controllers\admin\postcontroller
。
控制器类全面能被 , 这点是非常重要的,控制器类的实际命名空间对应这个属性, 否则,访问时你会收到"page not found"[译:页面找不到]。
如果你想打破上述的规则, 可以配置 controllermap 属性。
该属性指定应用展示给终端用户的语言, 默认为 en
标识英文。 如果需要之前其他语言可以配置该属性。
该属性影响各种 , 包括信息翻译、日期格式、数字格式等。 例如 yii\jui\datepicker 小部件会根据该属性 展示对应语言的日历以及日期格式。
推荐遵循 ietf language tag 来设置语言, 例如 en
代表英文, en-us
代表英文(美国).
该属性指定应用所包含的 。
该属性使用数组包含多个模块类 ,数组的键为模块id, 例:
[ 'modules' => [ // "booking" 模块以及对应的类 'booking' => 'app\modules\booking\bookingmodule', // "comment" 模块以及对应的配置数组 'comment' => [ 'class' => 'app\modules\comment\commentmodule', 'db' => 'db', ], ], ]
该属性指定你可能想展示给终端用户的应用名称, 不同于需要唯一性的 属性, 该属性可以不唯一,该属性用于显示应用的用途。
如果其他地方的代码没有用到,可以不配置该属性。
该属性为一个数组,指定可以全局访问的参数, 代替程序中硬编码的数字和字符, 应用中的参数定义到一个单独的文件并随时可以访问是一个好习惯。 例如用参数定义缩略图的长宽如下:
[ 'params' => [ 'thumbnail.size' => [128, 128], ], ]
然后简单的使用如下代码即可获取到你需要的长宽参数:
$size = \yii::$app->params['thumbnail.size']; $width = \yii::$app->params['thumbnail.size'][0];
以后想修改缩略图长宽, 只需要修改该参数而不需要相关的代码。
该属性指定应用代码的语言,默认为 'en-us'
标识英文(美国), 如果应用不是英文请修改该属性。
和 属性类似,配置该属性需遵循 ietf language tag. 例如 en
代表英文, en-us
代表英文(美国)
该属性提供一种方式修改php运行环境中的默认时区,配置该属性本质上就是调用php函数 , 例如:
[ 'timezone' => 'america/los_angeles', ]
该属性指定应用的版本,默认为'1.0'
, 其他代码不使用的话可以不配置。
实用属性
本小节描述的属性不经常设置,通常使用系统默认值。 如果你想改变默认值,可以配置这些属性。
该属性指定应用使用的字符集,默认值为 'utf-8'
, 绝大部分应用都在使用,除非已有的系统大量使用非unicode数据才需要更改该属性。
该属性指定未配置的请求的响应 规则, 路由规则可能包含模块id,控制器id,动作id。 例如help
, post/create
, admin/post/create
,如果动作id没有指定, 会使用yii\base\controller::$defaultaction中指定的默认值。
对于 web applications 网页应用, 默认值为 'site'
对应 sitecontroller
控制器,并使用默认的动作。 因此你不带路由的访问应用,默认会显示 app\controllers\sitecontroller::actionindex()
的结果。
对于 控制台应用, 默认值为 'help'
对应 yii\console\controllers\helpcontroller::actionindex()。 因此,如果执行的命令不带参数,默认会显示帮助信息。
该属性用数组列表指定应用安装和使用的 , 默认使用@vendor/yiisoft/extensions.php
文件返回的数组。 当你使用 composer 安装扩展,extensions.php
会被自动生成和维护更新。 所以大多数情况下,不需要配置该属性。
特殊情况下你想自己手动维护扩展,可以参照如下配置该属性:
[ 'extensions' => [ [ 'name' => 'extension name', 'version' => 'version number', 'bootstrap' => 'bootstrapclassname', // 可选配,可为配置数组 'alias' => [ // 可选配 '@alias1' => 'to/path1', '@alias2' => 'to/path2', ], ], // ... 更多像上面的扩展 ... ], ]
如上所示,该属性包含一个扩展定义数组,每个扩展为一个包含 name
和 version
项的数组。 如果扩展要在 阶段运行, 需要配置 bootstrap
以及对应的引导启动类名或 数组。 扩展也可以定义
该属性指定渲染 默认使用的布局名字, 默认值为 'main'
对应布局路径下的 main.php
文件, 如果 布局路径 和 视图路径 都是默认值, 默认布局文件可以使用路径别名@app/views/layouts/main.php
如果不想设置默认布局文件,可以设置该属性为 false
,这种做法比较罕见。
该属性指定查找布局文件的路径,默认值为 视图路径 下的 layouts
子目录。 如果 视图路径 使用默认值, 默认的布局路径别名为@app/views/layouts
。
该属性需要配置成一个目录或 路径 。
该属性指定临时文件如日志文件、缓存文件等保存路径, 默认值为带别名的 @app/runtime
。
可以配置该属性为一个目录或者路径 , 注意应用运行时有对该路径的写入权限, 以及终端用户不能访问该路径因为临时文件可能包含一些敏感信息。
为了简化访问该路径,yii预定义别名 @runtime
代表该路径。
该路径指定视图文件的根目录,默认值为带别名的 @app/views
, 可以配置它为一个目录或者路径 .
该属性指定 composer 管理的供应商路径, 该路径包含应用使用的包括yii框架在内的所有第三方库。 默认值为带别名的 @app/vendor
。
可以配置它为一个目录或者路径 , 当你修改时,务必修改对应的 composer 配置。
为了简化访问该路径,yii 预定义别名 @vendor
代表该路径。
该属性仅 控制台应用支持, 用来指定是否启用 yii 中的核心命令,默认值为 true
。
应用事件
应用在处理请求过程中会触发事件,可以在配置文件配置事件处理代码, 如下所示:
[ 'on beforerequest' => function ($event) { // ... }, ]
on eventname
语法的用法在 configurations 一节有详细描述.
另外,在应用主体实例化后,你可以在 阶段附加事件处理代码, 例如:
\yii::$app->on(\yii\base\application::event_before_request, function ($event) { // ... });
event_before_request
该事件在应用处理请求before之前,实际的事件名为 beforerequest
。
在事件触发前,应用主体已经实例化并配置好了, 所以通过事件机制将你的代码嵌入到请求处理过程中非常不错。 例如在事件处理中根据某些参数动态设置 yii\base\application::$language 语言属性。
event_after_request
该事件在应用处理请求 after 之后但在返回响应 before 之前触发, 实际的事件名为 afterrequest
。
该事件触发时,请求已经被处理完, 可以做一些请求后处理或自定义响应。
注意 组件在发送响应给终端用户时也会触发一些事件, 这些事件都在本事件 after 之后触发。
event_before_action
该事件在每个 运行before之前会被触发, 实际的事件名为 beforeaction
.
事件的参数为一个 yii\base\actionevent 实例, 事件处理中可以设置yii\base\actionevent::$isvalid 为 false
停止运行后续动作, 例如:
[ 'on beforeaction' => function ($event) { if (some condition) { $event->isvalid = false; } else { } }, ]
注意 和 都会触发 beforeaction
事件。 应用主体对象首先触发该事件,然后模块触发(如果存在模块),最后控制器触发。 任何一个事件处理中设置 yii\base\actionevent::$isvalid 设置为 false
会停止触发后面的事件。
event_after_action
该事件在每个 运行after之后会被触发, 实际的事件名为 afteraction
.
该事件的参数为 yii\base\actionevent 实例, 通过 yii\base\actionevent::$result 属性, 事件处理可以访问和修改动作的结果。例如:
[ 'on afteraction' => function ($event) { if (some condition) { // 修改 $event->result } else { } }, ]
注意 和 都会触发 afteraction
事件。 这些对象的触发顺序和 beforeaction
相反,也就是说, 控制器最先触发,然后是模块(如果有模块),最后为应用主体。
应用主体生命周期
当运行 处理请求时, 应用主体会经历以下生命周期:
- 入口脚本加载应用主体配置数组。
- 入口脚本创建一个应用主体实例:
- 入口脚本调用 yii\base\application::run() 运行应用主体:
- 触发 event_before_request 事件。
- 处理请求:解析请求 和相关参数; 创建路由指定的模块、控制器和动作对应的类,并运行动作。
- 触发 event_after_request 事件。
- 发送响应到终端用户.
- 入口脚本接收应用主体传来的退出状态并完成请求的处理。
上一篇: Linux下TCP、UDP网络编程框架