阿江 2017-10-05 07:43:25 2441次浏览 0条回复 0 0 0

说明

学习Yii Framework 2易2框架的过程是漫长的也是充满乐趣的以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现提供了较完整的代码供你参考不妥之处请多多指正

原文网址:

http://www.yiiframework.com/doc-2.0/guide-structure-applications.html

本文主题:应用(Applications)

应用是用于控制整体结构和Yii应用系统生命周期的对象,每个Yii应用系统包含唯一的应用对象,它将在入口脚本中生成,并可通过\Yii::$app 进行全局引用。 应用分为两种类型: Web应用(Web application):处理Web请求 控制台应用(console application):处理控制台命令请求

应用包括以下四部分内容: 应用配置(Application Configurations) 应用属性(Application Properties) 应用事件(Application Events) 应用生命周期(Application Lifecycle)

应用配置(Application Configurations)

When an entry script creates an application, it will load a configuration and apply it to the application, as follows: 当入口脚本创建一个应用时,它将加载配置并在应用中使用此配置,例如:

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

// load application configuration
$config = require(__DIR__ . '/../config/web.php');

// instantiate and configure the application
(new yii\web\Application($config))->run();

与普通配置相似,应用配置定义了如何初始化应用对象。因为应用配置非常复杂,所以通常将它们放在一个单独的配置文件中,如上例中的web.php文件。

应用属性(Application Properties)//property

必要属性(Required Properties):id,basePath 重要属性(Important Properties):aliases,bootstrap,catchAll,components,controllerMap,controllerNamespace,language,modules,name,params,sourceLanguage,timeZone,version 常用属性(Useful Properties):charset,defaultRoute,extensions,layout,layoutPath,runtimePath,viewPath,vendorPath,enableCoreCommands

必要属性(Required Properties):id,basePath
id

id定义了当前应用的唯一标识,用以区分其他应用,id主要用于编程环节,推荐使用字母数字字符(alphanumeric characters)来定义一个应用ID。

basePath

basePath定义了应用的根目录。通常会调用realpath()函数。 basePath用于定位一些重要目录,如运行时路径(runtime path) @app,basePath使用别名@app来代表。 @app/runtime,表示运行时路径。

重要属性(Important Properties):aliases,bootstrap,catchAll,components,controllerMap,controllerNamespace,language,modules,name,params,sourceLanguage,timeZone,version
aliases

aliases,别名,在应用配置中设置别名,相当于集中统一设置:Yii::setAlias() [

'aliases' => [
    '@name1' => 'path/to/path1',
    '@name2' => 'path/to/path2',
],

]

//aliases实例//namespace D:\phpwork\advanced\frontend\config\main.php

return [
		'aliases' => [
			//定义一个指向app/path/to/path1的别名name1
			'@name1' => '@app/path/to/path1',
			'@name2' => 'path/to/path2',
		],
		......
	],

D:\phpwork\advanced\frontend\controllers\PostController.php

    public function actionNew() {
        echo "<br>alias1:".Yii::getAlias('@name1');
        echo "<br>alias2:".Yii::getAlias('@name2');
    }
测试结果:
http://localhost:8082/post
/*
alias1:D:\phpwork\advanced\frontend/path/to/path1
alias2:path/to/path2
*/

//自定义别名,即命名空间根目录: D:\phpwork\advanced\common\config\bootstrap.php

Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('@commands', dirname(dirname(__DIR__)) . '/commands');

//添加一个commands别名: //在bootstrap.php中添加别名 D:\phpwork\advanced\common\config\bootstrap.php

Yii::setAlias('@commands', dirname(dirname(__DIR__)) . '/commands');

//在控制器中可以引用此别名的内容: D:\phpwork\advanced\frontend\controllers\PostController.php

    public function actionInfo() {
        return $this->render('@commands/info');
    }

//在别名文件夹下的文件内容 D:\phpwork\advanced\commands\info.php

<h1>This is commands/info files!</h1>
测试结果:
//访问:
http://localhost:8082/post/info
/*
This is commands/info files!
*/

//也可以将别名定义为绝对目录:

Yii::setAlias('@depositProof', '/images/uploads/depositProof');
Yii::setAlias('@domTemp', '/document/template');
bootstrap(启动属性)

bootstrap是非常有用的属性,它可以定义一个组件数组,在应用启动过程(bootstrapping process)中这个数组中的组件都将被执行,例如:如果要用一个模块实现自定义URL规则,你可以将这个模块的id加入到bootstrap属性的数组中。 启动属性中定义的组件在每次请求时都会被执行,所以应谨慎定义这些组件。 bootstrap属性中的组件可以定义为以下任一格式: 1、在commponents中定义一个应用组件id 2、在modules中定义的一个模块id 3、一个类名称 4、一个配置数组 5、一个可以返回一个组件的匿名函数

[

'bootstrap' => [
    //一个应用组件或模块id
    'demo',
    //一个类名称
    'app\components\Profiler',
    //一个配置数组
    [
        'class' => 'app\components\Profiler',
        'level' => 3,
    ],
    //一个匿名函数
    function () {
        return new app\components\Profiler();
    }
],

] 如果一个模块id与一个应用组件id重复,则应用组件会生效。在此种情况下,让模块生效可以使用如下匿名函数的方法: [

function () {
    return Yii::$app->getModule('user');
},

]

在启动过程中(bootstrapping process),每个组件都将被实例化。如果组件类继承自yii\base\BootstrapInterface,它的bootstrap()方法也将被调用。另一个实例是应用配置中的Basic Project Template,当运行在开发环境中时,debug和gii模块将被配置为启动组件。 if(YII_ENV_DEV){

$config['bootstrap'][]='debug';
$config['modules']['debug']='yii\debug\Module';
$config['bootstrap'][]='gii';
$config['modules']['gii']='yii\gii\Module';

}

catchAll

catchAll属性仅被Web应用支持,它定义了一个控制器动作,这个动作将处理所有的用户请求。主要用于应用维护期间 [

'catchAll' => [
    'offline/notice',
    'param1' => 'value1',
    'param2' => 'value2',
],

]

//catchAll实例 D:\phpwork\advanced\frontend\config\main.php

return [
		'catchAll' => [
			'offline/notice',
			'param1' => 'value1',
			'param2' => 'value2',
		],
		......
	],

D:\phpwork\advanced\frontend\controllers\OfflineController.php

<?php
namespace frontend\controllers;
class OfflineController extends CommonController {
    public function actionNotice($param1,$param2) {
        return "Web pause<br>reason1:".$param1."<br>reason2:".$param2;
    }
}
测试结果:
http://localhost:8082/
/*访问任何网址都将显示以下信息:
Web pause
reason1:value1
reason2:value2
*/
components,组件

组件(components)是最重要的属性,它是一个列表,列出了调用应用组件的名称,你可以在其他地方直接引用,例如:

[
	'components'=>[
		'cache'=>[
			'class'=>'yii\caching\Filecache',
		],
		'user'=>[
			'identityClass'=>'app\models\User',
			'enableAutoLogin'=>true,
		]
	],
]

每一个应用组件被定义为数组的一个键值对,键名代表组件ID,键值代表组件的类名称或配置信息。你可以为应用注册任何组件,并且这些组件可以在应用全局被使用,调用的表达式是:\Yii::$app->componentID。 Application Components的文档请参考: http://www.yiiframework.com/doc-2.0/guide-structure-application-components.html

controllerMap,控制器映射

controllerMap属性可以定义一个控制器ID与实际执行的控制器类的对应关系,通常,Yii映射控制器ID到控制器类是基于常规约定(convention)来处理(如:控制器ID post将对应于app\controllers\PostController),对于特定的控制器,你可以使用controllerMap属性来打破这种常规约定,如下例:

[
	'controllerMap' => [
		//account(控制器id)对应'app\controllers\UserController'
		'account' => 'app\controllers\UserController',
		//article对应'app\controllers\PostController'
		'article' => [
			'class' => 'app\controllers\PostController',
			'enableCsrfValidation' => false,
		],
	],
]
controllerNamespace,控制器命名空间

controllerNamespace定义了默认的命名空间,这样控制器类就可以被定位到。它的默认值是'app\controllers'。如果一个控制器ID是post,按照常规约定控制器类名(没有命名空间)将是PostController,而它的类全名将是app\controllers\PostController。

控制器类也可以通过控制器命名空间空位它的子目录,例如,amdin/post(控制器ID)的控制器类全名将是app\controllers\admin\PostController。

全名控制器类可以被自动加载,控制器类的实际命名空间与此属性定义的值相符,这些都是非常重要的,否则,当你准备访问这个应用时,你将看到"页面未找到"的错误信息。

如果你想突破以上约定,你可以定义controllerMap属性。

language,语言

language属性将定义应用使用的语言,也就是用户将看到的内容。默认值是end,也就是英语(English)。如果要支持多语言,你可以修改这个属性。 此属性值决定应用国际化的多个方面:信息翻译,数据格式,数字格式等等。例如:yii\DatePicker小部件(widget)将使用这个属性值确定在默认的日历中显示哪种语言,格式化为哪种日期格式。 推荐使用IETF语言格式来定义语言包,例如,en代表英语,en-us代表英语(美国)。 更多细节请参考国际化部分: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html

modules,模块配置:

modules属性定义应用包含哪些模块。 此属性定义了模块类或配置信息,数组中的键名将成为模块的ID,例如: [

'modules' => [
    //'booking'(模块ID)的模块类是'app\modules\booking\BookingModule'
    'booking' => 'app\modules\booking\BookingModule',
	//'comment'(模块ID)定义了一个配置数组
    'comment' => [
        'class' => 'app\modules\comment\CommentModule',
        'db' => 'db',
    ],
],

]

更多细节可以查看模块的文档: http://www.yiiframework.com/doc-2.0/guide-structure-modules.html

name,名称

name属性定义了应用名称,此名称将显示给最终用户。与id属性不同的是,name仅用于显示的目的,所以没有唯一性要求。如果在应用中没使用它,你可以不配置name属性。

params,参数

params属性定义了一个数组,此数据可以在全局获取应用的参数,这样在你的代码中就不用在代码中使用固定赋值的数字和字符串了。将应用参数统一定义,然后在不同的地方使用它们是个很好的习惯,例如,你可以定义缩略图尺寸参数: [

'params'=>[
	//定义缩略图尺寸size:
	'thumbnail.size'=>[128,128],
],

] 在需要使用size的地方,你的代码可以这样写: $size=\Yii::$app->params['thumbnail.size']; $width=\Yii::$app->params['thumbnail.size'][0]; 如果缩略图尺寸更改后,你只需要修改应用配置即可,而无需接触任何依赖的代码。

sourceLanguage,源代码语言

此属性定义应用代码书写的语言,默认值是'en-US',即英语(美国)。如果你的文本内容使用的不是英语,你可以定义此属性。 与language属性类似,你可以使用IETF语言标签定义此属性,例如:en代表英语,en-US代表英语(美国)。 更多细节可以参考国际化章节的文档: http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html

timeZone,时区

timeZone属性提供了一个替代PHP运行时间的解决方案,配置此属性实质上是调用PHP的date_default_timezone_set()函数,例如: [

'timeZone'=>'America/Los_Angeles',

]

version,版本

version属性定义应用的版本号,默认设置为'1.0'。如果在应用中不需要,则无需配置它。

常用属性(Useful Properties):charset,defaultRoute,extensions,layout,layoutPath,runtimePath,viewPath,vendorPath,enableCoreCommands

常用属性通常很少被配置,因为它们的默认值都是常规约定的。但如果你想改变它们也是可以在此修改的。

charset,字符集

charset属性定义应用使用的字符集。默认值是'UTF-8',对于大多数应用来说都是不用改变的,除非你将来的开发工作是基于一个老系统,而这个老系统中使用了非Unicode数据。

defaultRoute,默认路由

defaultRoute属性定义了当一个请求的路径不存在时,应用中要使用的路由。此路由可能包含一个子模块ID,一个控制器ID,一个动作ID。例如:help,post/create,admin/post/create。如果动作ID未指定,则此属性会自动获取yii\base\Controller::$defaultAction 。 在Web应用中,默认值是'site',也就是说SiteController控制器和它的默认动作。如果你获取一个应用没有定义一个路由,它将展示给你的将是app\controllers\SiteController::actionIndex()的结果。 在控制台应用中,默认值是'help',即yii\console\controllers\HelpController::actionIndex()命令将被调用。 命令行实例: d:\mycode>cd D:\phpwork\advanced D:\phpwork\advanced>php yii This is Yii version 2.0.8. The following commands are available:

  • asset Allows you to combine and compress your JavaScrip t and CSS files. asset/compress (default) Combines and compresses the asset files according to the given configuration. asset/template Creates template of configuration file for [[acti onCompress]].

  • cache Allows you to flush cache. cache/flush Flushes given cache components. cache/flush-all Flushes all caches registered in the system. cache/flush-schema Clears DB schema cache for a given connection com ponent. cache/index (default) Lists the caches that can be flushed. ...... Yii2 console的控制台命令帮助信息 To see the help of each command, enter: yii help <command-name>

D:\phpwork\advanced>

extensions,扩展

extensions属性定义了应用中安装的扩展列表。默认情况下,它将获取一个@vendor/yiisoft/extensions.php返回的数组。当使用Composer安装扩展时,将会自动产生和维护extensions.php文件。所以在大多数情况下,无需配置此属性。 特殊情况下,如果需要手动维护extensions属性时,你可以按照以下格式进行配置: [

'extensions' => [
    [
        'name' => 'extension name',
        'version' => 'version number',
        'bootstrap' => 'BootstrapClassName',  //可选项,也可以配置成一个数组
        'alias' => [  //可选项
            '@alias1' => 'to/path1',
            '@alias2' => 'to/path2',
        ],
    ],
    // ......
	//更多如上格式的扩展配置信息
],

]

如上所示,extensions属性是一个关于扩展定义的数组,每一个扩展都有一个name和version元素,如果一个扩展需要在bootstrap过程中运行,则需要定义一个bootstrap元素,并指定一个启动类或者一个配置数组。一个扩展也可能会定义一些别名(alias)。

layout,布局

layout属性定义了默认布局的名称,此布局在渲染一个视图时将被使用。默认值是'main',即在布局路径(layout path)下的main.php布局文件将被使用。如果布局路径和视图路径都是使用的默认值,那么默认的布局文件就是@app/views/layouts/main.php。 如果你不想使用默认的布局,那么你可以定义layout属性为false,当然这种情况是极其少见的。

layoutPath,布局路径

layoutPath属性定义了布局将要被查找的路径,默认值是视图路径(view path)下的layouts子目录,如果视图路径使用的是默认值,则默认的布局路径就是@app/views/layouts。 可以定义layoutPath为一个目录或者一个别名路径。

runtimePath,运行时路径

runtimePath为临时文件定义了一个目录,在此目录下将存放一些临时文件,如:日志文件、缓存文件等。默认值对应的文件目录是 @app/runtime。 可以定义此属性为一个目录或一个别名路径。需要注意的是运行时目录必须是一个可以被应用运行进程写入的目录。因为运行时目录中包含了敏感信息,所以这个路径应当不能够被最终用户所获取。 为了简化获取运行时目录,Yii为它定义了一个别名:@runtime。

viewPath,视图路径

viewPath属性定义视图文件存放的根目录,默认值对应的目录是@app/views。可以定义此属性为一个目录或一个别名路径。

vendorPath,供应商目录

vendorPath属性定义了Composer管理的供应商目录,它包含了应用中使用的第三方(third party)库文件,包括Yii框架。默认值对应的目录是:@app/vendor 此属性可以配置成一个目录或别名路径,当你更改此属性值时,请确保在Composer配置中也做了相应的更改。 Yii为供应商目录定义了一个别名:@vendor,可以更快捷的使用它。

enableCoreCommands,核心命令启用

enableCoreCommands属性仅在控制台应用中支持。它定义了在Yii发行包中的核心命令是否被启用,默认值是true。

应用事件(Application Events)

当处理一个请求时,一个应用会在生命周期中触发多个事件,可以在应用配置中使用以下代码来绑定事件处理器(event handler): [

'on beforeRequest'	=> function($event){
	//......
},

] "on eventName"格式的用法请参见配置章节: http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format 另外,也可以当应用实例创建后,在启动进程(bootstrapping process)中绑定事件处理器。例如: \Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST,function($event){

//......

});

EVENT_BEFORE_REUQEST

EVENT_BEFORE_REUQEST事件在应用处理一个请求之前被触发,实际的事件名称是beforeRequest。 当此事件触发时,应用实例已经配置并初始化,所以,通过此事件机制,拦截请求处理进程,在此插入自定义代码是最佳时机,例如:在事件处理器中,你可以基于一些参数,动态设置 yii\base\Application::$language 属性。

EVENT_AFTER_REQUEST

EVENT_AFTER_REQUEST事件在应用处理一个请求之后,发送响应结果之前被触发。它的实际名称是afterRequest。 当此事件触发时,请求处理已经完成,此时可以针对请求进行提交处理或响应的自定义处理。 注意:response组件也会在向最终用户发送响应内容时触发一些事件,这些事件将在EVENT_AFTER_REQUEST事件之后被触发。

EVENT_BEFORE_ACTION

EVENT_BEFORE_ACTION事件在运行每个控制器动作之前被触发,实际名称是beforeAction。 此事件参数是yii\base\ActionEvent的一个实例。 示例: [

'on beforeAction'=>function($event){
	if(some condition){
		//某种条件下,停止触发ActionEvent
		$event->isValid=false;
	}else{
		
	}
},

] 注意:同样的beforeAction事件会被模块和控制器所触发。应用对象的beforeAction事件将首先被触发,然后是模块(module)的,最后才是控制器(controller)的。如果事件处理器的yii\base\ActionEvent::$isValid 设置为false,则所有的后续事件将不再被触发。

EVENT_AFTER_ACTION

EVENT_AFTER_ACTION事件在运行完控制器动作之后触发,实际名称是afterAction。 此事件参数是一个yii\base\ActionEvent的实例。通过yii\base\ActionEvent::$result 属性,此事件可以修改动作的返回值,例如: [

'on afterAction'=>function($event){
	if(some condition){
		//modify $event->result
	}
},

] 注意:afterAction事件在模块或控制器中也会被触发,触发顺序与beforeAction正好相反,所以,控制器的afterAction事件最先被触发,然后是模块,最后是应用的。

应用生命周期(Application Lifecycle)

当一个入口脚本被执行用于处理一个请求时,一个应用将经历以下生命周期: 1、入口脚本加载应用的配置数组 2、入口脚本创建一个应用的新实例

1调用preInit(),配置高级别的应用属性如basePath
2注册错误处理器(error handler)
3配置应用属性
4调用init(),在此将调用bootstrap()运行启动组件

3、入口脚本调用yii\base\Application::run()运行这个应用

1)触发EVENT_BEFORE_REUQEST事件
2)处理请求:解析请求到合适的路由,提供相关的参数;根据路由创建一个模块、控制器和动作对象;运行动作。
3)触发EVENT_AFTER_REQUEST事件
4)发送响应到最终用户。

4、入口脚本从应用接收退出状态并完成请求进程。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册