Yii应用的目录结构和入口脚本
以下是一个通过高级模版安装后典型的Yii应用的目录结构:
.
├── backend
├── common
├── console
├── environments
├── frontend
├── nbproject
├── tests
├── vendor
├── composer.json
├── composer.lock
├── init
├── init.bat
├── LICENSE.md
├── README.md
├── requirements.php
├── yii
└── yii.bat
对于高级应用而言,相当于有 backend frontend console 三个独立的Yii应用。 由于 console 类的应用比较特殊,我们稍后再讲。这里讲典型的Web应用的目录结构。
公共目录
这里的公共目录可不止 common 目录,但这个目录从字面上来看, 是所有公共目录里最“公共”的。 common 目录下的东西, 对于本高级应用的任一独立的应用而言,都是可见、可用的。一般情况下, common 具有以下结构:
.
├── config
└── models
其中:
- config 就是通用的配置,这些配置将作用于前后台和命令行。
- mail 就是应用的前后台和命令行的与邮件相关的布局文件等。
- models 就是前后台和命令行都可能用到的数据模型。 这也是 common 中最主要的部分。
除了 common 之外,还有一个很重要的公共目录, vendor 。 这个目录从字面的意思看,就是各种第三方的程序。 这是Composer安装的其他程序的存放目录,包含Yii框架本身,也放在这个目录下面。 如果你向 composer.json 目录增加了新的需要安装的程序,那么下次调用Composer的时候, 就会把新安装的目录也安装在这个 vendor 下面。
好了,现在问题来了。对于 frontend backend console 等独立的应用而言, 他们的内容放在各自的目录下面,他们的运作必然用到Yii框架等 vendor 中的程序。 他们是如何关联起来的?这个秘密,或者说整个Yii应用的目录结构的秘密, 就包含在一个传说中的称为入口文件的地方。
但是在了解入口文件index.php之前,有必要先看看诸如 frontend 等独立应用的目录结构。 这比起整个Yii应用的目录结构面言,更为重要。因为你往往是在 frontend 等目录下写代码。 但是,不大会在 path\to\digpage 目录下写代码。
前台的目录结构
其实,前台和后台是一样的,只是我们逻辑上的一个划分。 典型的, frontend 具有如下的一个目录结构:
.
├── assets
├── config
├── controllers
├── models
├── runtime
├── views
├── web
└── widgets
按照顺序来讲:
- assets 目录用于存放前端资源包PHP类。 这里不需要了解什么是前端资源包,只要大致知道是用于管理CSS、js等前端资源就可以了。
- config 用于存放本应用的配置文件,包含主配置文件 main.php 和全局参数配置文件 params.php 。
- models views controllers 3个目录分别用于存放数据模型类、视图文件、控制器类。这个是我们编码的核心,也是我们工作最多的目录。
- widgets 目录用于存放一些常用的小挂件的类文件。
- tests 目录用于存放测试类。
- web 目录从名字可以看出,这是一个对于Web服务器可以访问的目录。 除了这一目录,其他所有的目录不应对Web用户暴露出来。这是安全的需要。
- runtime 这个目录是要求权限为 chmod 777 ,即允许Web服务器具有完全的权限, 因为可能会涉及到写入临时文件等。 但是一个目录并未对Web用户可见。也就是说,权限给了,但是并不是Web用户可以访问到的。
backend 目录与 frontend 的结构、内容是一样一样的。 所谓的前台和后台,只是人为从逻辑上对Web应用的功能划分,目的在于分解应用的规模和复杂程度, 便于维护和使用。从代码角度来讲,Yii压根就不认得哪个是前台,哪个是后台。
前面提到的,传说中的入口文件 index.php 就位于 web 目录下面。
入口文件index.php
首先来看看 index.php 文件的内容:
1 |
<?php |
设置调试模式和代码环境
- 前两行是两个 define 语句::
- defined(‘YII_DEBUG’) or define(‘YII_DEBUG’, true); defined(‘YII_ENV’) or define(‘YII_ENV’, ‘dev’);
定义当前的运行模式和环境。如果定义了 YII_DEBUG , 那么表示当前为调试状态,应用在运行过程中,会有一些调试信息的输出。 在抛出异常时,也会有一个详细的调用栈的显示。默认情况下, YII_DEBUG 为 false 。 但在开发过程中,最好按上面写的那样,定义为 true 这样便于查找和分析错误。
如果定义了 YII_ENV ,那么就是指定了当前应用的运行环境。 上面的代码显示应用将运行于 dev 环境。默认情况下, YII_ENV 为 prod 表示产品环境。
这些环境只是一个名称,具体的意义和环境内容要看环境的定义。 dev prod 是Yii安装后默认的两个环境,分别表示开发环境和最终的产品环境。 此外还有一个 test 环境,表示测试环境。
环境与模式的作用不同。环境在代码中主要是影响配置文件。 YII_ENV 的 dev prod test 三种环境, 会分别使 YII_ENV_DEV YII_ENV_PRODYII_ENV_TEST 的值为 true 。 这样,在应用的配置中,特别是在相同的一个配置文件中,可以对不同环境作出不同的配置。
比如,你希望在测试环境下,使用另一个数据库。在开发环境下,启用调试工作条,等等。那么,可以这么做:
1 |
$config = [...]; if (!YII_ENV_TEST) { |
其实,这个 YII_ENV 的定义就是一个与 init 脚本环境切换的相互补充。 如果各环境比较明晰,用 init 来切换各种环境的配置是完全够用的。 不必在脚本中再有如 YII_ENV_TEST 之类的判断语句,这会使本来已经显得很长的配置文件看上去更臃肿。
引入必要的文件
紧接着两个 define 语句之后,就是4个 require 语句:
require(__DIR__ . '/../../vendor/autoload.php');
require(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/../../common/config/bootstrap.php');
require(__DIR__ . '/../config/bootstrap.php');
这4个语句的前3个中都使用到了相对于当前目录的叔伯目录中的php文件, 第4个语句使用了相对于当前目录的兄弟目录。
我们知道, __DIR__ 表示当前文件 index.php 所在的目录。 /../../ 表示的是当前目录的爷爷目录。 若 index.php 的当前目录是/path/to/digpapge.com/frontend/web , 那么爸爸目录就是 frontend ,爷爷目录就是 digpage.com 了。
第一个require引入了 /path/to/digpage.com/vendor 下面的 autoload.php 。 这个是composer的类自动加载机制注册文件。引入这个文件后,可以使用composer的类自动加载功能。
第二个引入了 vendor 下面的 yiisoft/yii2/Yii.php ,这是Yii的工具类文件。 引入了这个类文件后,才能使用Yii的提供的各种工具, 才有Yii::createObject() Yii::$app 之类的东东可以使用。
第三个引入了 /path/to/digpage.com/common 下面的 config/bootstrap.php 。 这个文件主要用于执行一些Yii应用引导的代码,比如定义一系列的路径别名:
1 |
<?php |
这是默认安装后定义好的 common frontend backend console vendor 5个路径别名, 如果你要新增一个用于表示插件的目录 plugin 可以自己在这个文件里面加一行:
Yii::setAlias('plugin', dirname(dirname(__DIR__)) . '/plugins');
第四个require引入了 path/to/digpage.com/frontend 下面的 config/bootstrap.php 。 作用与上面类似,只是其中的代码仅适用于当前应用(frontend)。 而第三个require中的,是适应于所有应用(common)。
再接下来,是一个函数 yii\helpers\ArrayHelper::merge() 。 这个函数的作用在于合并参数所指定的各个数组。其中,后面的数组会把前面数组中相同下标的元素覆盖掉。 这个语句的作用,就是读取、合并应用的各配置文件并保存在 $config 变量中。 这里我们看到一共是读取了4个配置文件:
require('path/to/digpage.com/common/config/main.php'),
require('path/to/digpage.com/common/config/main-local.php'),
require('path/to/digpage.com/frontend/config/main.php'),
require('path/to/digpage.com/frontend/config/main-local.php')
依次是通用目录common下的2个配置文件,和当前应用frontend下的2个配置文件。 在优先顺序上,当前的配置覆盖通用的配置。 同时,带有 -local 的配置文件在后,所以,本地配置文件覆盖团队配置文件。
最后,以 $config 为参数,实例化了一个 Application 对象,并调用他的 run() 函数。 这时,Yii应用就跑起来了。
命令行应用入口脚本
命令行应用的入口脚本是 path/to/digpage.com/yii 文件。这个文件被 init 脚本设为可执行的。 他的内容如下:
1 |
#!/usr/bin/env php |
对比于Web应用的 index.php 入口脚本, yii 并没有太多的新东西,其中核心的东西根本就没变。
我们先来看看这个这个 yii 是什么?
首先,它没有扩展名,我们不好知道其具体类型。 但是从文件内容的第一行 #!/usr/bin/env php 来看,这是一个bash脚本。 第一行在告诉bash,也在告诉我们,这是一个使用PHP运行的脚本。
但第二行的 <?php 又清楚的向我们表明,这货其实也是个 PHP 文件,只是没有加上PHP后缀而已 。
接下来, define('STDIN') 和 define('STDOUT') 则为fcgi定义了标准输入和标准输出。
在各require语句中,由于 yii 的位置与 index.php 不同,是位于应用根目录下,所以目录结构上更简单些。
最后,在Yii应用跑起来后,还要获取其返回值,并以该返回值退出脚本,通知操作系统退出时的状态。
对于Windows系统而言,命令行的入口脚本仍然是 yii ,但是命令行下无法直接运行。所以, 细心的Yii为我们准备了一个 yii.bat 。这个文件会以 php yii 形式调用PHP来运行入口脚本 。
http://www.digpage.com/
Yii应用的目录结构和入口脚本的更多相关文章
- yii基础应用目录结构
basic/ 应用根目录 composer.json Composer 配置文件, 描述包信息 config/ 包含应用配置及其它配置 console.php 控制台应用配置信息 web.php We ...
- Yii2目录结构
assets 前端资源文件夹,大致用于管理css js等前端资源文件等 commands 包含命令行命令 文件为控制器文件 config 应用程序的配置文件 controllers 控制器文 ...
- Symfony2目录结构说明
了解框架的目录结构是框架快速入门的一个途径,一个成熟的框架,每个功能模块都被划分存放在不同的目录. Symfony2一级目录结构: ├── app //这目录下包含了,配置文件(应用的配置文件会被im ...
- 【Tomcat】安装Tomcat服务器&Tomcat的目录结构
创建时间:6.14 一.安装Tomcat服务器 Tomcat下载ver8的,现在用的多 下载并解压 配置环境变量:(切记!!不然startup那步会闪退) 1.新建系统环境变量: (1)进入根目录,复 ...
- Vue3(三)CND + ES6的import + 工程化的目录结构 = 啥?
突发奇想 这几天整理了一下vue的几种使用方式,对比之后发现有很多相似之处,那么是不是可以混合使用呢?比如这样: vue的全家桶和UI库,采用传统的方式加载(CND.script). 自己写的js代码 ...
- YII框架开发一个项目的通用目录结构
YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...
- yii学习笔记(1),目录结构和请求过程
最近找找工作面试,发现很多要求会yii.于是准备学习一个新的框架 先在腾讯课堂找了个视频看了一下,然后去网上现在了“归档文件”(还有一种方式是通过php的包管理工具“composer”安装) 归档文件 ...
- Yii 1.1.17 一、安装、目录结构、视图、控制器、扩展自定义函数
这几天了解了一下Yii框架,以简单的博客项目实战入门.大致的实现流程做个记录. 一.Yii 安装与环境检测 从 www.yiiframework.com 获取一份Yii的拷贝,解压到 /wwwroot ...
- python——复制目录结构小脚本
引言 有个需要,需要把某个目录下的目录结构进行复制,不要文件,当目录结构很少的时候可以手工去建立,当目录结构复杂,目录层次很深,目录很多的时候,这个时候要是还是手动去建立的话,实在不是一种好的方法,弄 ...
随机推荐
- HTML5【语法要点】
一.头部设置 <!--页面窗口自动调整到设备宽度,并禁止用户及缩放页面--> <meta name="viewport" content="width= ...
- linux上安装subversion
1.安装svn服务器端 yum install subversion 从镜像下载安装svn服务器端 中间会提示是否ok,输入y,确认 安装成功提示:.....complete! 依次执行 ...
- [Django]登陆界面以及用户登入登出权限
前言:简单的登陆界面展现,以及用户登陆登出,最后用户权限的问题 正文: 首先需要在settings.py设置ROOT_URLCONF,默认值为: ROOT_URLCONF = 'www.urls'# ...
- #essay 161218# 自己的markdown笔记(日记)方法
写在前面 本文可能极度无聊--自己markdown笔记方法 我的工具 1. computer 2. samsung mobile phone(自己的小S3) 3. markdownpad 2 4. p ...
- VIM 常用命令
1.当vi打开时默认为命令模式,要转入输入模式,需要按a或者i键. 命令模式下: :wq 保存并且退出 :w 只保存不推出 :q 不保存退出 :q! 不保存强制退出 :wq! 保存并强制退 ...
- Eclipse调试常用技巧
1. 条件断点 断点大家都比较熟悉,在Eclipse Java 编辑区的行头双击就会得到一个断点,代码会运行到此处时停止. 条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才 ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- Nmap参数详解
转自:http://blog.csdn.net/huangwwu11/article/details/20230795 Nmap--networkmapper,网络探测工具和安全/端口扫描器 nmap ...
- jQuery EasyUI视频教程合集
下载地址:http://www.fu83.cn/thread-269-1-1.html 教程内容: 尚学堂科技_jqueryeasyui视频教程_白贺翔 李炎恢jQuery EasyUI视频教程全集 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...