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 = array(‘name‘=>‘user‘,‘value‘=>‘zhangsan‘)//新建cookie数据
    $cookies->add(new Cookie($cookie_data));
    $cookies-remove(‘id‘);//删除cookie
    $cookies.getValue(‘user‘);//获取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

这样就达到了视图复用的作用。

当然了,视图与模板之间还有数据传递以及继承覆盖的功能。



时间: 2024-08-02 06:54:42

YII2框架详解的相关文章

MTK平台LCD驱动框架详解(一)

许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

jQuery Validate验证框架详解

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

【转】jQuery Validate验证框架详解

jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type="text/javascript" src="<%=path %>/validate/jquery-1.6.2.min.js"></script> <script type="text/javascript" src

iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

这里接着前文<iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)>,主要是干货环节,列举了如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 三. 常用方法的封装 虽然 PhotoKit 的功能强大很多,但基于兼容 iOS 8.0 以下版本的考虑,暂时可能仍无法抛弃 ALAssetLibrary,这时候一个比较好的方案是基于 ALAssetLibrary 和 PhotoKit 封装出一系列模拟系统 Asset 类的自定义类,然后在其中封装好兼容 A

iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLibrary 封装出通用的方法. 这里引用一下前文中对 PhotoKit 基本构成的介绍: PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源 PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值 PHAssetCo

(转) shiro权限框架详解06-shiro与web项目整合(上)

http://blog.csdn.net/facekbook/article/details/54947730 shiro和web项目整合,实现类似真实项目的应用 本文中使用的项目架构是springMVC+mybatis,所以我们是基于搭建好的项目进行改造的. 将shiro整合到web应用中 登录 退出 认证信息在页面展现,也就是显示菜单 shiro的过滤器 将shiro整合到web应用中 数据库脚步 sql脚步放到项目中,项目上传到共享的资源中,文章最后给出共享url. 去除项目中不使用shi

Java并发编程之---Lock框架详解

Java 并发开发:Lock 框架详解 摘要: 我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性,比如响应中断等.Lock 提供了比 synchronized更广泛的锁操作,它能以更优雅的方式处理线程同步问题.本文以synchronized与Lock的对比为切入点,对Java中的Lock框架的枝干部分进行了详细介绍,最后给出了锁的一些相关概念. 一

另外几种Java集合框架详解续

另外几种Java集合框架详解续 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs fastutil库优于Trove库的地方:Trove库已经三年未更新了,属于非活跃的开源项目:而fastutil一直在更新.fastutil有更丰富的特性,支持超大的集合(大于2^32,即4GB的集合),文档也更丰富. fastutil是一个开源的Java集合框架的扩展,它继承了Java Collection Framework,提供了数