1、目录结构说明
assets
: 资源目录,一般定义了项目里会使用的JS和CSS文件路径
commands
: CLI程序的控制器目录,新手建议删除,熟手你要进行PHP的CLI开发就保留
config
: 配置文件目录,基本都是返回数组
controllers
: 控制器目录
mail
: 邮件模板目录
models
: 模型目录,基本上就是ORM模型
runtime
: 运行时目录,留空即可
每次运行的缓存、日志、调试数据、自定义保存的数据等都会默认存到这里
建议为这个runtime目录添加.gitignore或SVN忽略属性,忽略目录内所有的东西,这样任它运行时产生什么东东也不会被加入到 版本库
vendor
: 扩展目录,除了有Yii框架,还有其它PHP扩展,基于Composer的打包规范
views
: 视图目录,就是大家脑袋中想着被控制器display的那个嘛
web
: web网站访问目录,相当于TP框架的public目录,WEB主机配置到这个目录就对了
以上所有目录的部署结构都可以完全自定义安排————等你玩熟了这个框架的话,都是可以配置修改的东西
2、创建一个类
平时实例化一个类都是new ClassName()这样的语法,但是Yii类提供了一个createObject的静态方法来创建类
![](https://img-blog.csdnimg.cn/20190221144800439.png)
2.1、通过配置来创建一个类
$config = [
'class' => 'yii\log\FileTarget',
'logFile' => 'D:/a.log',
'maxFileSize' => 3306,
];
$target = Yii::createObject($config);
echo $target->logFile; // D:/a.log
echo $target->maxFileSize; //3306
config里的class就是要创建的类,$config['logFile']是控制了类的logFile属性,maxFileSize也是这个道理
一切配置的底层都是靠Yii::createObject来new相关组件的,包括你未来自己扩展的配置
3、配置一个类
Yii::configure可以将一个与类的属性名对应的数组值注入到类的属性中
$target = new \yii\log\FileTarget();
$config = [
'logFile' => 'D:/a.log',
'maxFileSize' => 3306,
];
$target = Yii::configure($target, $config);
echo $target->logFile; // D:/a.log
echo $target->maxFileSize; //3306
4、配置文件
配置文件默认都放在@app/config目录下
一般情况下配置文件最终要做的事情就是返回一个数组,这些数组就像前面内容所暗示的那样,在底层通过Yii::createObject和Yii::configure来创建一个个最终让你调用的对象
1)、web.php配置文件:
它的数组第一层key是控制yii\web\Application这个类的,因为入口文件index.php中new yii\web\Application($config)
第一层配置key都有哪些作用,可以看看yii\web\Application的文档
2)、yii::$app
比如web.php第一层有个key叫id的话,那你是可以通过Yii::$app->id来得到配置的值的,===》$config()的第一层key
再比如,如果你把db这个key给删除了,那访问Yii::$app->db就会报错,因为没有装载db组件,Yii::$app可以通过components的配置来装载、卸载不同的组件。===》$config()的第二层key
Yii的这个静态属性 $app是框架初始化的时候就实例化的了,以后我们还要通过$app获取更多数据,以及调用更多东西,所以这个是我们将会最经常访问的全局单例对象,而web.php里面的第二层、第三层很多则是控制了app里面类型为object(对象)的属性
5、组件(yii\base\Component)
Yii总是强调自己是一个基于组件的框架,组件(yii\base\Component)是Yii应用的主要基石。组件是该类或其子类的实例
笼统地说,一切代码里关于Yii::$app->xxx的app的属性,如果这个属性是一个object,那你基本上可以理解为组件,比如:
Yii::$app->request
Yii::$app->response
Yii::$app->user
Yii::$app->log
Yii::$app->db
5.1、components属性定义组件
Yii让我们在配置文件的components这个key里定义组件
yii\base\Application::components 属性
入口文件index.php中new yii\web\Application($config)
核心类Application extends \yii\base\Application
在主配置文件中:
yii默认会根据components数组里面的键值去vendor\yiisoft\yii2\web 里面查找这个键值得类,如果没有找到,再根据这个键值得数组里面的Class属性去找这个类,如果这个键值得Class属性为空,而且vendor\yiisoft\yii2\web 没有键值命名的类,则会报错。
vendor\yiisoft\yii2\web 目录里面所有的类,我们都可以通过配置components数组,更改这些类的默认参数值。
5.2、组件的访问使用
1.一个应用组件会在第一次访问时实例化,使用如下方式访问组件:Yii::$app->urlManager;
2.如果如果处理请求过程没有访问的话就不实例化。有时你想在每个请求处理过程都实例化某个组件即便它不会被访问,可以将该组件ID加入到应用主体的 yii\base\Application::bootstrap 属性中。
5.3、核心应用组件
◆reqeust: 请求组件
主要负责提供请求相关的信息数据,调用urlManager组件实现解析URL到控制器方法,请求Cookie的校验读取,csrf攻击的防御
◆urlManager: URL管理组件
负责解析URL,它返回的值会告诉你:当前请求的URL想调用哪个模块的哪个控制器的哪个方法
◆view: 视图组件
负责渲染视图,并返回HTML字符串
◆response: 响应组件
主要负责将header和数据发送给客户端,还有cookie也是
并提供了重定向、发文件(提供下载)、响应图片|音频|视频等字节流的便捷方法,还可以自定义响应数据序列化的格式
◆db: 数据库组件
更多是使用yii\db\ActiveRecord和yii\db\Query这些类,它们的底层会自动调用db组件做事,还包括读写分离、数据库事务的控制
◆cache: 缓存组件
◆user: 用户组件:最常用这个组件去管登陆|访问授权相关的事情
◆log: 日志组件
5.4、添加自己的组件
先定义一个app\Test
类
namespace app;
class Test{
public $name = 'x';
public $age = 19;
public function __construct(){
echo 'test init<br/>';
}
}
然后在配置的components里增加一个组件配置:
'components' => [
//...略过其它组件的配置
'test' => [
'class' => 'app\Test',
'name' => 'may'
],
],
调用的测试代码:
echo Yii::$app->test->name; //输出test init 然后再输出了may
echo Yii::$app->test->age; //不再输出test init
通常定义的组件都会继承yii\base\Component,以获得Yii封装的特性来方便地做更多事情