其他分享
首页 > 其他分享> > yii2.0 学习笔记之二 应用结构

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