首页 > 代码库 > YII2框架详解

YII2框架详解

yii2框架的安装我们在之前文章中已经提到下面我们开始了解YII2框架

Yii2的应用结构:
技术分享

目录篇:

技术分享

        技术分享技术分享
 advance版本的特点是:根目录下预先分配了三个模块,分别是前台、后台、控制台模块。
1.backend
它主要用于管理后台,网站管理员来管理整个系统。
技术分享
技术分享
assets 目录用于存放前端资源包PHP类。 这里不需要了解什么是前端资源包,只要大致知道是用于管理CSS、js等前端资源就可以了。
config 用于存放本应用的配置文件,包含主配置文件 main.php 和全局参数配置文件 params.php 。
models views controllers 3个目录分别用于存放数据模型类、视图文件、控制器类。这个是我们编码的核心,也是我们工作最多的目录。
widgets 目录用于存放一些常用的小挂件的类文件。
tests 目录用于存放测试类。
web 目录从名字可以看出,这是一个对于Web服务器可以访问的目录。 除了这一目录,其他所有的目录不应对Web用户暴露出来。这是安全的需要。
runtime 这个目录是要求权限为 chmod 777 ,即允许Web服务器具有完全的权限, 因为可能会涉及到写入临时文件等。 但是一个目录并未对Web用户可见。也就是说,权限给了,但是并不是Web用户可以访问到的。

    
2.frontend
技术分享
我们的目标最终用户提供的主要接口的前端应用。其实,前台和后台是一样的,只是我们逻辑上的一个划分.。
技术分享
 好了,现在问题来了。对于 frontend backend console 等独立的应用而言, 他们的内容放在各自的目录下面,他们的运作必然用到Yii框架等 vendor 中的程序。 他们是如何关联起来的?这个秘密,或者说整个Yii应用的目录结构的秘密, 就包含在一个传说中的称为入口文件的地方。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?phpdefined(‘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‘);
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();


3.console
控制台应用程序包含系统所需要的控制台命令的。
技术分享
 技术分享



下面是全局公共文件夹
4.common
技术分享
技术分享

其中:

  • config 就是通用的配置,这些配置将作用于前后台和命令行。
  • mail 就是应用的前后台和命令行的与邮件相关的布局文件等。
  • models 就是前后台和命令行都可能用到的数据模型。 这也是 common 中最主要的部分。

 公共的目录(Common)中包含的文件用于其它应用程序之间共享。例如,每一个应用程序可能需要访问该数据库的使用 ActiveRecord。因此,我们可以将AR模型类放置在公共(common)的目录下。同样,如果在多个应用程序中使用了一些辅助(helper )或部件类(widget ),我们也应该把这些放置在公共目录(common)下,以避免重复的代码。
  正如我们将很快解释,应用程序也可以共享一部分的共用配置。因此,我们还可以存储config目录下共同的常见配置。
当开发一个大型项目开发周期长,我们需要不断调整数据库结构。出于这个原因,我们还可以使用数据库迁移(DB migrations )功能来保持跟踪数据库的变化。我们将所有 DB migrations(数据库迁移)目录同样都放在公共(common)目录下面。

5.environment
每个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

6.vendor
技术分享
 技术分享
 vendor 。 这个目录从字面的意思看,就是各种第三方的程序。 这是Composer安装的其他程序的存放目录,包含Yii框架本身,也放在这个目录下面。 如果你向composer.json 目录增加了新的需要安装的程序,那么下次调用Composer的时候, 就会把新安装的目录也安装在这个 vendor 下面。

下面也是一些不太常用的文件夹
7.vagrant
技术分享
 技术分享
8.tests
技术分享
 技术分享

入口文件篇:

1、入口文件路径:

http://127.0.0.1/yii2/advanced/frontend/web/index.php

每个应用都有一个入口脚本 web/index.PHP,这是整个应用中唯一可以访问的 PHP 脚本。一个应用处理请求的过程如下:

1.用户向入口脚本 web/index.php 发起请求。
2.入口脚本加载应用配置并创建一个应用实例去处理请求。
3.应用通过请求组件解析请求的路由。
4.应用创建一个控制器实例去处理请求。
5.控制器创建一个操作实例并针对操作执行过滤器。
6.如果任何一个过滤器返回失败,则操作退出。
7.如果所有过滤器都通过,操作将被执行。
8.操作会加载一个数据模型,或许是来自数据库。
9.操作会渲染一个视图,把数据模型提供给它。
10.渲染结果返回给响应组件。
11.响应组件发送渲染结果给用户浏览器

可以看到中间有模型-视图-控制器 ,即常说的MVC。入口脚本并不会处理请求,而是把请求交给了应用主体,在处理请求时,会用到控制器,如果用到数据库中的东西,就会去访问模型,如果处理请求完成,要返回给用户信息,则会在视图中回馈要返回给用户的内容。

2、为什么我们访问方法会出现url加密呢?

技术分享

我们找到文件:vendor/yiisoft/yii2/web/UrlManager.php

    return "$baseUrl/{$route}{$anchor}";
} else {
    $url = "$baseUrl?{$this->routeParam}=" . urlencode($route);
    if (!empty($params) && ($query = http_build_query($params)) !== ‘‘) {
        $url .= ‘&‘ . $query;
    }
将urlencode去掉就可以了
3、入口文件内容
 技术分享
入口文件流程如下:
技术分享


MVC篇:

技术分享

一、控制器详解:

1、修改默认控制器

  打开vendor/yiisoft/yii2/web/Application.php

eg:

public $defaultRoute = ‘student‘;
2、建立控制器示例:StudentController.php

//命名空间

namespace frontend\controllers;


use Yii; 

use yii\web\Controller;   vendor/yiisoft/yii2/web/Controller.php   (该控制器继承的是\yii\base\Controller)
\web\Controller.php中干了些什么  
1、默认开启了 授权防止csrf攻击
2、响应Ajax请求的视图渲染
3、将参数绑定到动作(就是看是不是属于框架自己定义的方法,如果没有定义就走run方法解析)
4、检测方法(beforeAction)beforeAction() 方法会触发一个 beforeAction 事件,在事件中你可以追加事件处理操作;
5、重定向路径 以及一些http Response(响应) 的设置
use yii\db\Query; //使用query查询
use yii\data\Pagination;//分页  
use yii\data\ActiveDataProvider;//活动记录  
use frontend\models\ZsDynasty;//自定义数据模型 


class StudentController extends Controller
{  
 $request = YII::$app->request;//获取请求组件
   $request->get(‘id‘);//获取get方法数据
   $request->post(‘id‘);//获取post方法数据
   $request->isGet;//判断是不是get请求
   $request->isPost;//判断是不是post请求
   $request->userIp;//获取用户IP地址
    $res = YII::$app->response;//获取响应组件
    $res->statusCode = ‘404‘;//设置状态码
    $this->redirect(‘http://baodu.com‘);//页面跳转
    $res->sendFile(‘./b.jpg‘);//文件下载

 $session = YII::$app->session;
    $session->isActive;//判断session是否开启
    $session->open();//开启session
    //设置session值
    $session->set(‘user‘,‘zhangsan‘);//第一个参数为键,第二个为值
    $session[‘user‘]=‘zhangsan‘;
    //获取session值
    $session->get(‘user‘);
    $session[‘user‘];
    //删除session值
    $session-remove(‘user‘);
    unset($session[‘user‘]);

 $cookies = Yii::$app->response->cookies;//获取cookie对象
    $cookie_data = http://www.mamicode.com/array(‘name‘=>‘user‘,‘value‘=>‘zhangsan‘)//新建cookie数据>
//显示视图
return $this->render(‘add‘); 默认.php
return $this->render(‘upda‘,["data"=>$data]); 
 

   }
}

二、模型层详解

   简单模型建立:

  

<?php
namespace frontend\controllers;
use Yii;
use yii\web\controller;
use frontend\models\ListtModel;
class ListtController extends Controller{
    public  function  actionAdd(){
         $model=new ListtModel;
        $data=$model->find()->asArray()->where("id=1")->all();
        print_r($data);
    }
}
?>

控制器引用
<?php
namespace frontend\controllers;
use Yii;
use yii\web\controller;
use frontend\models\ListtModel;

class ListtController extends Controller{
    public  function  actionAdd(){
        $model=new ListtModel;
        $data=$model->find()->asArray()->where("id=1")->all();
        print_r($data);
    }
}
?>


三、视图层详解首先在frontend下建立与控制器名一致的文件(小写)eg:student 在文件下建立文件

eg:index.php
每一个controller对应一个view的文件夹,但是视图文件yii不要求是HTML,而是php,所以每个视图文件php里面都是视图片段:
技术分享技术分享

技术分享
  而views下面会有一个默认的layouts文件夹,里面存放的就是布局文件,什么意思呢?:
在控制器中,会有一个layout字段,如果制定他为一个layout视图文件,比如common.php,那么视图就会以他为主视图,其他的view视图片段都会作为显示片段嵌入到layout文件common.php中.
而如果不明确重载layout字段,那么默认layout的值是main,意味着layouts的main.php是视图模板。
控制器:
技术分享
技术分享
common.php:
技术分享
技术分享
layouts 
技术分享技术分享

这样就达到了视图复用的作用。
当然了,视图与模板之间还有数据传递以及继承覆盖的功能。










YII2框架详解