本文共 5325 字,大约阅读时间需要 17 分钟。
1.yii框架确实比TP强大很多,扩展性很强,性能更应该是给力,虽然我还没用他做过项目。
basic版本的特点是:默认根目录就是一个主模块,如果还有其他的模块,可以在根目录下新建一个modules目录并配置为一个模块目录,在modules下面再分配模块
与TP一样,一个controller对应一个view文件夹
传说中的入口文件 index.php 就位于 web 目录下面。 其中的index.php是 应用入口,做一些初始化工作 首先来看看 index.php 文件的内容:
1 2 3 4 5 6 7 8 9101112131415161718 | defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../../vendor/autoload.php'); require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . '/../../common/config/bootstrap.php'); require(__DIR__ . '/../config/bootstrap.php'); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../../common/config/main.php'), require(__DIR__ . '/../../common/config/main-local.php'), require(__DIR__ . '/../config/main.php'), require(__DIR__ . '/../config/main-local.php')); $application = new yii\web\Application($config);$application->run(); |
里面有yii引擎的核心文件以及各种yii插件应用依赖第三方的包
··································· ··································· ··································· advance
版本的特点是:根目录下预先分配了三个模块,分别是前台、后台、控制台模块。 assets 目录用于存放前端资源包PHP类。 这里不需要了解什么是前端资源包,只要大致知道是用于管理CSS、js等前端资源就可以了。 config 用于存放本应用的配置文件,包含主配置文件 main.php 和全局参数配置文件 params.php 。
models views controllers 3个目录分别用于存放数据模型类、视图文件、控制器类。这个是我们编码的核心,也是我们工作最多的目录。
widgets 目录用于存放一些常用的小挂件的类文件。
web 目录从名字可以看出,这是一个对于Web服务器可以访问的目录。 除了这一目录,其他所有的目录不应对Web用户暴露出来。这是安全的需要。
runtime 这个目录是要求权限为 chmod 777 ,即允许Web服务器具有完全的权限, 因为可能会涉及到写入临时文件等。 但是一个目录并未对Web用户可见。也就是说,权限给了,但是并不是Web用户可以访问到的。
我们的目标最终用户提供的主要接口的前端应用。
其实,前台和后台是一样的,只是我们逻辑上的一个划分.。 好了,现在问题来了。对于 frontend backend console 等独立的应用而言, 他们的内容放在各自的目录下面,他们的运作必然用到Yii框架等 vendor 中的程序。 他们是如何关联起来的?这个秘密,或者说整个Yii应用的目录结构的秘密, 就包含在一个传说中的称为入口文件的地方。 1 2 3 4 5 6 7 8 9101112131415161718 | defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../../vendor/autoload.php'); require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php'); require(__DIR__ . '/../../common/config/bootstrap.php'); require(__DIR__ . '/../config/bootstrap.php'); $config = yii\helpers\ArrayHelper::merge( require(__DIR__ . '/../../common/config/main.php'), require(__DIR__ . '/../../common/config/main-local.php'), require(__DIR__ . '/../config/main.php'), require(__DIR__ . '/../config/main-local.php')); $application = new yii\web\Application($config);$application->run(); |
其中:
- config 就是通用的配置,这些配置将作用于前后台和命令行。
- mail 就是应用的前后台和命令行的与邮件相关的布局文件等。
- models 就是前后台和命令行都可能用到的数据模型。 这也是 common 中最主要的部分。
公共的目录(Common)中包含的文件用于其它应用程序之间共享。例如,每一个应用程序可能需要访问该数据库的使用 ActiveRecord。因此,我们可以将AR模型类放置在公共(common)的目录下。同样,如果在多个应用程序中使用了一些辅助(helper )或部件类(widget ),我们也应该把这些放置在公共目录(common)下,以避免重复的代码。
正如我们将很快解释,应用程序也可以共享一部分的共用配置。因此,我们还可以存储config目录下共同的常见配置。 当开发一个大型项目开发周期长,我们需要不断调整数据库结构。出于这个原因,我们还可以使用数据库迁移(DB migrations )功能来保持跟踪数据库的变化。我们将所有 DB migrations(数据库迁移)目录同样都放在公共(common)目录下面。 每个Yii环境就是一组配置文件, 包含了入口脚本 index.php和各类配置文件。 其实他们都放在/environments 目录下面.
从上面的目录结构图中,可以看到,环境目录下有3个东东: - 目录 dev
- 目录 prod
- 文件 index.php
其中, dev 和 prod 结构相同,分别又包含了4个目录和1个文件:
- frontend 目录,用于前台的应用,包含了存放配置文件的 config 目录和存放web入口脚本的web 目录
- backend 目录,用于后台应用,内容与 frontend 相同
- console 目录,用于命令行应用,仅包含了 config 目录,因为命令行应用不需要web入口脚本, 因此没有 web 目录。
- common 目录,用于各web应用和命令行应用通用的环境配置,仅包含了 config 目录, 因为不同应用不可能共用相同的入口脚本。 注意这个 common 的层级低于环境的层级,也就是说,他的通用,仅是某一环境下通用,并非所有环境下通用。
- yii 文件,是命令行应用的入口脚本文件。
对于分散于各处的 web 和 config 目录而言,它们也是有共性的。
- 凡是 web 目录,存放的都是web应用的入口脚本,一个 index.php 和一个测试版本的index-test.php
- 凡是 config 目录,存放的,都是本地配置信息 main-local.php 和 params-local.php
vendor 。 这个目录从字面的意思看,就是各种第三方的程序。 这是Composer安装的其他程序的存放目录,包含Yii框架本身,也放在这个目录下面。 如果你向 composer.json 目录增加了新的需要安装的程序,那么下次调用Composer的时候, 就会把新安装的目录也安装在这个 vendor 下面。 每一个controller都要声明一个namespace, 与TP一样,一个controller必须继承引擎的controller,并且一个controller对应一个view的文件夹,一个action对应一个请求处理。
输出视图时,用render(),renderPartial(). 每一个
controller对应一个view的文件夹,但是视图文件yii不要求是HTML,而是php,所以每个视图文件php里面都是视图片段: 而views下面会有一个默认的layouts文件夹,里面存放的就是布局文件,什么意思呢?: 在控制器中,会有一个layout字段,如果制定他为一个layout视图文件,比如common.php,那么视图就会以他为主视图,其他的view视图片段都会作为显示片段嵌入到layout文件common.php中. 而如果不明确重载layout字段,那么默认layout的值是main,意味着layouts的main.php是视图模板。 当然了,视图与模板之间还有数据传递以及继承覆盖的功能。
model不是必须定义的,因为系统会默认给你定义。
在模型层中,有model和activeRecord两种方式的model.其中
activeRecord是继承了 model。 Model负责数据层交互,ActiveRecord应该是封装了一些业务逻辑,以及本身的持久化等功能。model就是负责单纯的数据库操作,插入查询更新等功能。ActiveRecord就是在这个基础上,要进行一些业务逻辑的判断,或者封装一些方法,比如将一个插入操作封装成一个add方法,使用的时候直接调用add,然后传入一组数据,就自动帮你插入数据库了,不需要写sql语句。
另外model层的
activeRecord具有魔术get、set方法,能把get yii的缓存功能很有意思。包括:普通数据缓存、视图块缓存、页面缓存、http缓存。
最重要的是缓存依赖,给缓存一个解除时间或者一个解除事件。
Gii是一个代码模板生成器,只要按照你给定的参数,便可以生成各种代码,而这些代码的编写是重复性的劳动。