当前位置: 首页 > Web后端 > PHP > 正文

Yii2.0基础框架

2017-04-10 来源:cnblogs 枫爷

缘起

因为一个月的短暂停留,我在给朋友搞事情,所以Yii系列的文章耽搁了很长时间,现在又重拾当时的知识,给大伙好好撸下这一系列的博客

提起Yii,虽然是国外的开发者搞的,但是它的作者是华人,这才是让我们引以为豪的,如果以后有机会薛强回国大力发展PHP事业,我肯定回去他麾下搞事情,为PHP在国内的发展贡献自己的一份力,虽然现在没有这个能力,这不薛强没回来嘛,回来的话那时的我肯定可以的~哈哈哈~

领英上强哥的背景如下:

职务:MicroStrategy 公司担任构架师

地址:美国首都华盛顿 Metro Area

教育:

杜克大学·计算机科学·博士

浙江大学·计算机科学·硕士

强哥是土生土长的中国人,在美国有固定全职工作,英文很好,同时中文一点问题都没有!!

好了,话步前言,上节我们已经将Yii2.0完整的安装到我们的机器中啦,在浏览器中输入下面的地址,你就可以访问你的服务器应用啦~

http://服务器IP/app/yii/web/index.php

出现下面的命令那就对啦~

整体结构

assets文件夹:assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件 ,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问。

commands文件夹:控制台脚本存放的地方,自动运行脚本

config文件夹:配置文件存放的文件夹

controller文件夹:MVC中C文件存放的文件夹

mail文件夹:邮件发送目录,具体干啥的我还在摸索中哈~

models文件夹:MVC中M文件存放的文件夹

runtime:日志文件

tests:测试脚本文件夹

vendor:第三方组件存放,composer下载的组件存放的文件夹,自动帮你autoload

views:MVC中V存放的文件夹

web:web主应用入口脚本存放的位置

以上是整个文件夹的布局,里面的各个文件有啥用,我会在后续的【应用Yii2.0搭建后台应用框架】中详细介绍

我这一系列的文章均来自于Yii中文网中对Yii2.0的权威指南,感谢国内开发者对社区的贡献,感谢翻译的人,让我们免去了百度翻译之苦。

如果大家不太喜欢我的描述,可以去看一下官方对Yii2.0的解释,很详细,但很官方,不会调戏你^_^

官方文档【中文版】:http://www.yiichina.com/doc/guide/2.0

Yii 应用参照模型-视图-控制器 (MVC)设计模式来组织。不懂MVC?这么说吧,不管是前端应用还是后端应用,首当其冲的设计模式就是MVC。所以了解它相当有必要!

M模型代表数据、业务逻辑和规则;V视图展示模型的输出;C控制器接受出入并将其转换为模型和视图命令。

这就是Yii的整个框架结构设计,我们的MVC就是其中的控制器,视图和模型,他们的各自作用上面也讲了下,一般的后端应用,M表示从数据库、第三方链接、本地文件中获取的数据进行处理,整理,在交给到V端,V端的作用一般是在页面中反馈给用户的页面,如果是以数据的形式返回给用户,那这个V层就不用做过多的渲染。C层的话主要是连接两者的作用,C层获取到用户的请求,传给M层,M层处理好数据,反馈给C层,C层再将数据给到V层,V层展示给用户。MVC模型的便捷之处就是逻辑清晰,每个模块负责自己的事,有条有理,非常便于初学者理解,是一个入门的模型。

除此之外,Yii还包含其他逻辑处理块,比方说上面图中的入口脚本【调用应用一开始必被调用的脚本文件】,应用主体【Yii::$app全局可访问对象】,应用组件【全局通用的一些工具集】,模块【业务逻辑单元,每个业务逻辑一个模块,会让代码很清晰】,过滤器【规范行为的对象,在控制器执行之前或之后调用,定义一类特殊的行为】,前端资源和小部件我们先不讲,因为是涉及到前端的一些组件内容,后面我会单独开辟一个系列来讲前端知识,我出这一系列的目的主要是针对后台应用~

入口脚本

心细的朋友可能早就发现了,为啥我们在上面的访问链接中后面有个index.php,对,就是它,它就是入口脚本,每次web请求都必须经过它!

http://172.16.122.58/app/yii/web/index.php

一般他都是在web这个目录下面的,这个是web应用的入口脚本。

还有个入口脚本是啥呢,控制台脚本,下面的那个叫yii的php脚本,啥作用呢,你们想想啊,电商后台中,如果有很多人要调整库存,是不是调整一次就给改一次呀,肯定不会呀,库存操作如果调用数据库太频繁了,数据库肯定扛不住的,我们的做法就是先放到类似于Redis的缓存中,等到一定量的时候,或者有个1秒钟的时候我们给同步一次数据库,同步的方式就是调用控制台脚本啦,配合Linux的crontab,完美解决数据库调用过于频繁的问题。控制台脚本后面我们会介绍,一般业务线中用的还挺多的。

入口脚本主要完成以下工作:

定义全局常量;

注册 Composer 自动加载器;

包含 Yii 类文件;

加载应用配置;

创建一个应用实例并配置;

调用 yii\base\Application::run() 来处理请求。

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

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

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

(new yii\web\Application($config))->run();

入口脚本是定义全局常量的最好地方,话虽如此,不建议在这里定义啥全局变量!Yii 支持以下三个常量:

YII_DEBUG:标识应用是否运行在调试模式。当在调试模式下,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈。因此,调试模式主要适合在开发阶段使用,YII_DEBUG 默认值为 false。

YII_ENV:标识应用运行的环境。YII_ENV 默认值为 'prod',表示应用运行在线上产品环境。

YII_ENABLE_ERROR_HANDLER:标识是否启用 Yii 提供的错误处理,默认为 true。

autoload.php,读过我之前文章的朋友肯定对他有印象,PSR-4,自动加载器哈,这个是注册composer自动加载器的。

Yii.php,包含Yii类的文件路径。

倒数第二行是加载应用配置。最后一行是运行一个应用,这里面的$config【web.php】这个文件会在后面详细解答。

应用主体配置

应用主体在入口脚本中创建并能通过表达式 \Yii::$app 全局范围内访问。访问的变量定义在哪儿呢,由于应用主体配置比较复杂,就是刚刚提到的$config,config文件夹中的web.php文件。后面比较复杂的配置都可以放到单个文件中,这是个技巧,即减少了配置文件的代码行数,也将整个框架清晰很多。

这个里面定义了很多属性,我们来分别看下吧。

<?php

$params = require(__DIR__ . '/params.php');

$config = [

params这个参数里的所有变量就被定义在params.php这个文件里面。

下面是我的项目中配置的一些文件在上方定义

<?php

$params = require(__DIR__ . '/params.php');
$rules = require(__DIR__ . '/rules.php');
$aliases = require(__DIR__ . '/aliases.php');
$cacheConfig = require(__DIR__ . '/cache.php');

这里面主要是params参数,rules路由规则,aliases别名规则,cacheConfig缓存配置,你可能会怀疑,为何db这么关键的没有配置上来,db是区分环境的,在index.php中会区分stable环境、pro环境还是测试环境做区分。

我们还是回到我们的Yii源码,配置文件上方配置了params所在的文件,

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'A9BMCrvbxuCEnE39rVpOUECgcBJTnzUH',
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'params' => $params,
];

这边有几个属性,id、basePath、bootstrap和components。其他还有几个比较重要的属性:aliases、language、modules。

id

yii\base\Application::id 属性用来区分其他应用的唯一标识ID。一般配置为程序名称。必要属性之一。

basePath

yii\base\Application::basePath 指定该应用的根目录。系统预定义 @app 代表这个路径。你如果需要require目录内的文件,可以使用这个方式找到对应文件。另外一个必要属性,这个是必须得配置的。

bootstrap

这个属性很实用,它允许你用数组指定启动阶段yii\base\Application::bootstrap()需要运行的组件。一般后端应用中配置个

    'bootstrap' => ['log'],

即可。

components

这是最重要的属性,它允许你注册多个在其他地方使用的应用组件。比方说session、log、db和cache啊,都在这里面配置的,具体的下一节应用组件中会讲到。

aliases

该属性允许你用一个数组定义多个别名。数组的key为别名名称,值为对应的路径。

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

我的配置里面都是设置的extension扩展类的别名,extension里面放置一些基础调用类,比方说CURL、微信支付等等的。

[
    '@ext' => dirname(__DIR__) . '/extensions',
]