yii2.0 学习笔记之二 应用结构
作者:互联网
总览
入口脚本
一个应用只有一个入口脚本
web应用的入口脚本必须放在终端用户能够访问的目录下,通常命名为Index.php
控制台应用的入口脚本一般在应用根目录下命名为yii,这样用户就能通过命令来运行控制台应用
入口脚本主要完成以下工作
定义全局常量
注册composer 自动加载器
包含yii类文件
加载应用配置
创建一个应用实例并配置
调用yii\base\Application::run()处理请求
web应用
控制台应用
定义常量
yii支持下面三个常量
YII_DEBUG 标识应用是否运行在调试模式,是的话应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈,默认为false
YII_ENV 标识应用运行的环境,默认为prod,表示运行在线上
YII_ENABLE_ERROR_HANDLER 表示是否启用yii提供的错误处理,默认true
定义一个常量时,通常使用类似如下代码来定义
defined('YII_DEBUG') or define('YII_DEBUT', true);
//等同于
// if (!defined('YII_DEBUG') {
// define('YII_DEBUG', true)
// })
应用主体
应用主体是管理yii应用系统整体结构和生命周期的对象。每个yii应用系统只能包含一个应用主体,应用主体在入口脚本中创建并能通过表达式 \Yii::$app 全局范围内访问
应用主体配置
如下,当入口脚本创建了一个应用主体,它会加载一个配置文件并传给应用主体
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
// 加载应用主体配置
$config = require __DIR__ . '/../config/web.php';
// 实例化应用主体、配置应用主体
(new yii\web\Application($config))->run();
应用主体属性
应用主体配置文件中有许多重要的属性要配置
必要属性
id 用来区分其他应用的咐一标识id
basePath
指定该应用的根目录。根目录包含应用系统所有受保护的源代码,也经常用于派生一些其他 重要路径,系统预定义@app代表这个路径
重要属性
aliases
允许用一个数组定义多个别名,数组的key为别名名称,值为对应的路径
[
'aliases' => [
'@name1' => 'path/to/path1',
'@name2' => 'path/to/path2',
],
]
bootstrap
允许用数组指定启动阶段bootstrapping process 需要运行的组件
[
'bootstrap' => [
// 应用组件ID或模块ID
'demo',
// 类名
'app\components\Profiler',
// 配置数组
[
'class' => 'app\components\Profiler',
'level' => 3,
],
// 匿名函数
function () {
return new app\components\Profiler();
}
],
]
catchAll
仅web applications网页应用支持,指定一个要处理所有用户请求的控制器方法,通常在维护模式下使用
components
这个是最重要的属性,允许注册多个在其他地方使用的应用组件
[
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
],
]
在应用中可以任意注册组件,并可以通过表达式\Yii::$app->ComponentID全局访问
controllerMap
允许指定一个控制器id到任意控制器类。yii遵循一个默认的规则指定控制器id到任意控制器类(如post对应app\controlers\PostController)。通过配置这个属性,可以打破这个默认规则
controllerNamespace
指定控制器类默认的命名空间,默认为app\controllers。比如控制器id为post默认对应PostController(不带命名空间)。类全名为app\contollers\PostController
language
该属性指定应用展示给终端用户的语言
modules
该属性指定应用所包含的 模块
name
该属性指定你可能想展示给终端用户的应用名称
params
该属性为一个数组,指定可以全局访问的参数
sourceLanguage
该属性指定应用代码的语言
略
应用事件
应用在处理请求过程中会触发事件,配置事件处理代码
应用主体生命周期
应用组件
应用主体是服务定位器,它部署一组提供各种不同功能的应用组件来处理请求。例如,urlManager组件锁骨下动脉处理网页请求路由到对应的控制器。db组件提供数据库相关服务等等
通过如下表达式访问
\Yii::$app->componentsID
应用组件可以是任意对象,可以在应用主体配置配置,但要谨慎注册,应用组件就像全局变量,使用太多会加大测试和维护难度
[
'components' => [
// 使用类名注册 "cache" 组件
'cache' => 'yii\caching\ApcCache',
// 使用配置数组注册 "db" 组件
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
// 使用函数注册"search" 组件
'search' => function () {
return new app\components\SolrService;
},
],
]
引导启动组件
上面的应用组件只会在第一次访问时实例化,如果处理请求过程中没有访问的话就不实例化,强制实例化可将组件id加入到应用主体的bootstrap属性中,如下
[
'bootstrap' => [
'log',
function($app){
return new ComponentX();
},
function($app){
// 可以写自定义的代码
return;
}
],
'components' => [
'log' => [
// "log" 组件的配置
],
],
]
核心应用组件
控制器
是继承yii\abse\Contoller 类的对象,负责处理请求和生成响应。具体来说,控制器从应用主体接管控制后会分析请求数据并会传送到模型,传送模型结果到视图,最后生成输出响应信息
动作
控制器由操作组成,它是执行终端用户请求的最基础的单元,一个控制器可有一个或多个操作
namespace app\controllers;
use Yii;
use app\models\Post;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
class PostController extends Controller
{
public function actionView($id)
{
//根据请求模型id加载模型
//加载成功渲染名称为view的视图并显示
//否则抛出一个异常
$model = Post::findOne($id);
if ($model === null) {
throw new NotFoundHttpException;
}
return $this->render('view', [
'model' => $model,
]);
}
public function actionCreate()
{
//先将请求数据填入模型
//保存模型
//两者都成功,跳转到id为 新创建的模型 的view操作,
//否则提供用户输入的create视图
$model = new Post;
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
路由
用户通过路由动作,路由包含以下部分字符串
模块id
控制器id
操作id
路由使用如下格式
ContollerID/ActionID
如果属于模块下的控制器,使用如下格式
ModuleID/ContollerID/ActionID
创建控制器
在web applications 网页应用中,控制器应继承yii\web\Controller或它的子类
同理在在console applications 控制台应用中,控制器应继承yii\console\Controller或它的子类
如下代码定义一个site控制器
namespace app\controllers;
use yii\web\Controller;
class SiteController extends Controller
{
}
控制器id 通常情况下,控制器用来处理请求有关的资源类型,因此控制器id通常为和资源有关的名词。例如使用article作为处理文章的控制器id
控制器id可包含子目录前缀。例如admin/article代表contoller namesapce控制器命名空间下admin子目录中article控制器
控制器类命名
控制器i遵循以下规则衍生控制器类名
1.将用正斜杠区分的每个单词每一个字线转为大写。注意如果控制器id包含正斜杠,会将最后的正斜杠后的部分每一个字母转为大写
2.去掉中横杠,将正斜杠替换为反斜杠
3.增加Controller反缀
4.在前面增加controller namespace控制器命名空间
示例
article 对应 app\controllers\ArticleController
post-comment 对应 app\controllers\PostCommentController
admin/post-comment 对应 app\controllers\admin\PostCommentController
控制器部署
可通过配置controller map 来强制上述的控制器id和类名对应,通常用在使用第三方不能掌控类名的控制器上
配置应用配置中
[
'controllerMap' => [
// 用类名申明 "account" 控制器
'account' => 'app\controllers\UserController',
// 用配置数组申明 "article" 控制器
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
]
标签:控制器,app,yii,笔记,之二,应用,组件,yii2.0,id 来源: https://www.cnblogs.com/Qyhg/p/14723993.html