yii_yii框架 - CSDN
yii 订阅
Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。Yii是创始人薛强的心血结晶,于2008年1月1日开始开发。 展开全文
Yii Framework是一个基于组件、用于开发大型 Web 应用的高性能 PHP 框架。Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。Yii是创始人薛强的心血结晶,于2008年1月1日开始开发。
信息
外文名
Yii Framework
编    写
OOP编写
本    质
PHP 框架
用    途
开发大型Web应用
中文名
Yii
创始人
薛强
yii概述
Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用。Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程。从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。 [1] 
收起全文
精华内容
参与话题
  • Yii2.0 PHP框架

    万人学习 2018-10-22 21:38:03
    具体实例讲解Yii框架的核心内容。
  • Yii框架与项目

    千次阅读 多人点赞 2020-05-06 21:38:14
    第二部分:初始Yii2 2.1结构 2.2生命周期 上半部分创建了一个应用主体,应用主体明确了由哪个控制器去接管后面的工作。 第1步,发出url后,apache会执行index.php这个文件,在Yii框架中,这个文件叫入口...

    第一部分:需求

    第二部分:初始Yii2

    2.1结构

    2.2生命周期

    上半部分创建了一个应用主体,应用主体明确了由哪个控制器去接管后面的工作。

    第1步,发出url后,apache会执行index.php这个文件,在Yii框架中,这个文件叫入口文件。
    这个文件在web目录下,执行此文件件主要做2件事:
    1. 读取配置文件web.php
    2. 配置文件的数据来实例化这个应用主体。
    应用主体会控制接下来的整个生命周期,直到响应出结果。应用实体具体是什么,稍后详
    解。
    第2步,应⽤实体接下来要进⾏路由解析,路由解析就是是根据url中的参数r, 来决定由哪些
    代码来完成用户的请求。这一步先取得r的值。
    第三步,在请求组件的帮助下,解析出路由。这个例⼦解析的结果就是要创建⼀个叫
    SiteController的控制器的实例,并且执行里面的actionIndex⽅法

    下半部分是我们写的代码,是按MVC来组织的代码,下面的代码就是在执行mvc的步骤。

     

    2.3入口文件

    • 定义全局常量;

    • 注册 Composer 自动加载器;

    • 包含 Yii 类文件;

    • 加载应用配置;

    • 创建这个应用实例并配置;

    • 调⽤用yii\base\Application::run() 来处理请求。

    2.4应用主体

    应用主体是通过index.php进行生成的

    <html lang="<?= Yii::$app->language ?>”>

    Yii::$app->user->identity->username
    Yii::$app->homeUrl

    Yii::$app->charset

    basePath :指定该应用的根目录
    aliases :用一个数组定义多个 别名。数组的key为别名名称,值为对应的路径。
    components :这是最重要的属性,它允许你注册多个在其他地方使用的的应用组件.
    defaultRoute :该属性指定缺省的路由规则,’defaultRoute’=>'site/about'

    第三部分:控制器

    3.1初识

    3.2小知识

     控制器从yii\web\Controller类继承来

    $this是控制器对象本身,调的render(中文的意思是着色的意思)法(相当于TP中的assign)

    第四部分:视图

    4.1初识

    4.2布局

    第五部分:模型

    5.1初识

    5.2流程

    5.3函数解释

    refresh就是让页面进行刷新一次

    5.4表单

    • 中间是通过调用ActiveForm::field() 方法来创建这个ActiveField 实例,这个实例会创建表单的input标签和JavaScript 验证。
    • ActiveField有对应的模型和属性,input 输入框的 name 属性会自动地根据属性名来创建;同时,还会用属性的验证规则(由js进行验证)来验证用户输入的数据。
    • ActiveField如何进行使用,就要参考手册<?= $form->field($model,'email')?>

    5.5块赋值

    表单生成的input中的name,实际是以对象名来命名的这个数组,数组的键和模型的属性对应,提交的数据就是键对应的值。
    在模型那边执行load方法,其实就是对每个属性执行这样语句赋值:
    $model->name = isset($data['name']) ? $data['name'] : null;

    5.6助手类HTML

    前面按钮的例子,就是用纯html写就这样。也可以用html 帮助类的submitButton方法来写。前面得div里面的

    第六部分:博客原型

    6.1别名

    6.2配置文件

    箭头后面的是权利大的,不会被覆盖掉,前面得会被覆盖掉

    6.3需求分析

     

    6.4表结构

    分析表结构:

    post表:对应adminuser外键与poststatus外键

    comment表:对应commitstatus外键、user_id外键与post_id外键

    tag表:单独的tag标签用于记录标签云

    migration表:系统的yii自己产生的表

    6.5Gii

    6.5.1概念

    Gii 是一个基于Web的代码生成器,可以用来生成模型,控制器,表单,增删查改等等这些

    类或功能的代码。Gii也叫脚手架程序,是一种辅助工具。

    6.5.2配置

    首先,要在配置main-local.php,配置Gii模块开启,我们只要在浏览器上输入这个网址,注意参数 r=gii,这样就可以使用Gii了。

    6.5.3作用

    Gil是可以个可以帮你写代码的神奇工具。可以用来生成模型,增删查改,控制器,表单,

    模块,扩展这些代码。

    6.5.4模型类

    1. 首先要我们填写数据库表名,我们先创建文章的模型类,文章的表名是post,
    2. 然后是模型类的类名,我们命名为post。
    3. 然后是命名空间,这个是用common/models,因为这个类是前后台共用的。
    4. 其他的都用默认值就可以了。
    5. 点preview,预览这个按钮后,告诉你,将会在common/models这个目录下生成Post.php的模型⽂件。
    6. 可以点开来粗略看看⽂件的内容,这些就模型类的代码。
    7. 没有问题就可以点“生成“这个按钮,告诉你已经成功生成了Post模型⽂件。

    模型文件主要包括以下内容:

    1.属性:有属性,属性标签,数据规则,块赋值这些东西。在ActiveRecord这块也不会少,这些就是所谓的业务数据---属性。

    2.业务规则:模型类的业务规则,业务数据有些是必填项,有些必须为字符串,有些字段必须为整数。title这些要求是字符串,并且不能超过128个字符。

    3.属性标签:

    4.业务逻辑:其它几个方法就是业务逻辑。里面用到的hasmany hasone这些⽅法,都是ActiveRecord这

    个类提供的方法

    6.5.5增删改查

    1.进行增删查改的代码生成页面,先要输入模型类的类名,注意要把命名空间写全。先从文章Post开始。
    2.还要生成一个PostSearch这个类,这个类是用来进文章搜索的,我们在后台完善文章管理那一章会详细分析这个类。
    3.接下来是控制器类,注意增删查改功能是后台的功能,我们把它放到backend目录下的controllers目录里面,类
    名设为PostController。
    4.再下来,这里填写视图模板文件存放的目录。@app指的是当前应用的根目录,注意这斜杠的方向,和命名空间是有区别的。
    5.点预览,可以看到,将要生成一堆文件。

     

    第七部分:后台功能完善

    7.1文章查看一(连接数据库)

    7.1.1代码展示

    1.文章查看控制器动作

    public function actionView($id)
    {
        return $this->render('view', [
       'model' => $this->findModel($id),
       ]);
    }

    7.2文章查看模型动作

    protected function findModel($id)
    {
            if (($model = post::findOne($id)) !== null) {
                return $model;
            } else {
                throw new NotFoundHttpException('The requested page does not exist.');
            }
    }

    7.1.2使用数据库

    1.定义:
    2.使用yii\db\Connection链接
     这段代码表示会创建一个 yii\db\Connection 对象,并用这个对象来访问数据库。
    3.使用yii\db\Command访问与操作
    他的缺点也很明显:
    1. 不同数据库系统的SQL语句会有些差别,因此无法做到代码适用于多种数据库系统。
    2. 用数组保存结果,而没有用到面向对象的方式来管理数据,这样就失去了许多面向对象
    开发的好处。
    3. 不安全,如果不小心,会留下SQL注入这种不安全的因素,比如你不是通过绑定,而是直

    Yii通过数据库访问对象(Database Access Objects,简称DAO)来使用数据库。DAO是建立在 PDO 之上的,一套面向对象的方式来访问数据库的API。

    我们之前连接数据库,就是在main-local配置文件中,这样写就可以连上数据库。

     这个对象的写法: Yii::$app->db,等下查询数据时就会用到这个对象。

     

     

    接把$_GET[‘id’]写到sql语句中,那么就危险了。

    7.2文章查看二ActiveRecord

    7.2.1什么是ActiveRecord

    Active Record (活动记录,以下简称AR)提供了1个面向对象的接口, 用以访问数据库中
    的数据。
    • 1个 AR 类关联1张数据表,每个 AR 对象对应表中的一行。
    • AR对象的属性,对应为数据标的列
    • 可以直接以面向对象的方式来操纵数据表中的数据,这样就不需要写SQL语句就能实现数

    据库的访问。

    7.2.2声明ActiveRecord 类

    来看看post类,要声明1个 AR 类,最少,你需要从 yii\db\ActiveRecord 基类来继承, 并
    且要实现 tableName 的方法,明确这个AR类的属性是关联哪张数据表。这样就已经声明了1
    个最基本的AR类。当然,1个完整的AR类还应该有属性标签,数据规则,业务代码这些内
    容。
    我们来把post表简化一下,比如,只有4个字段,id是主关键字。 我们只需要实现Post类中

    的tablename方法,就已经建立好对应post这个数据库表的AR类,类名也是Post。

    7.2.3如何查询数据

    两种方法:
    AR 提供了两个静态方法来构建 DB 查询,并且把查询到的数据填充到 AR 对象实例中,最
    后返回这个对象。
    这两个方法,1个是find,1个是findBySql:
    yii\db\ActiveRecord::find()
    yii\db\ActiveRecord::findBySql()

    7.2.4find方法

            第1点,ActiveRecord方法有两个快捷方法:findOne 和 findAll,可以来替换find方法。

            第2点,可以看出,例子中的两个查询条件是比较简单的,我们实际开发中很多时候会遇到

    更为复杂的查询条件。

            find方法是创建1个ActiveQueryInterface实例对象来实现查询的。这个创建好的ActiveQueryInterface对象,需要进1步调用ActiveQueryInterface中已经定义好的方法来设置查询条件,最后才通过调用one或all方法来得到AR对象。   

    例子
    $posts = Post::find()->where(['AND',['status' => 2],['author_id' => 1],['Like','title','yii2']])
    ->orderBy(‘id')->all();

    7.2.5findbysql() 查询数据

            command对象来查询非常类似,都是要写SQL,但是这个返回的是对象,而command返回的是数组。 

    7.2.6ActiveRecord      

    7.2.7ActiveRecord如何操作数据

         访问列数据

          find方法得到model对象后,使用model->id就可以读出id这个列的值,这个的id和title就是数据表的列名。

    注意,如果返回的是对象数组时,我们应该使用foreach来遍历每个对象。

    7.2.8操作数据

          AR 提供下面这些方法来实现插入、更新和删除等功能:
          yii\db\ActiveRecord::save()        yii\db\ActiveRecord::insert()

          yii\db\ActiveRecord::update()    yii\db\ActiveRecord::delete()

          save方法可以用来替代insert和update方法。

          ActiveRecord可以说是Yii框架的灵魂,它把数据库和模型建立了联系,使用面向对象的方式来操纵数据表中的数据,一个 AR 类关联一张数据表,每个 AR 对象对应表中的一行。关于ActiveRecord的知识还不止这些,我们后面还会不断补充。

    7.3文章查看三拼接数据表

    7.3.1数据小部件

            顾名思义,数据小部件用来显示数据的小模块。 常用的小部件有DetailView,ListView。
            DetailView:主要用来显示1条记录数据的详细情况。

            ListView 和 GridView:他们可以用来显示1个拥有分页、 排序和过滤功能的1组数据。

     

    7.3.2DetailView数据小部件

    DetailView小部件通常用来显示的是一条记录的详情。

     

    1. 一个Model模型类对象。
    2.  一个AR类的实例对象。
    3. 由键值对构成的一个关联数组

     

    7.3.3关联表查询

    看看代码,在Post文章类中,只要实现一个叫getStatus0的方法,就可以建立起两张表的关联关系了,getStatus0方法的返回值是执行文章对象本身的hasone方法的结果,hasone方法参数中第1项Poststatus::className()就是文章状态表的表名,第2项是关联的条件,这是poststatus表里面id字段等于Post表中的status字段。

    这段代码就是建立文章章类和文章状态类的关联关系。

    代码思路:
    这样的话,我们要拿到“已发布”这个⽂字,就可以了
    $thePost->status0->name
    这种形式来拿到了。
    $model->status0相当于1个 poststatus文章状态的对象, 然后取它的name属性值,就可以了。

    7.3.4多对一 一对多

    这里的hasOne方法,因为文章对于文章状态来说,是多对一 一对一的关系。

    这里的hasMany方法,因为文章对于文章评论来说,是一对多的关系。

    7.3.5图表展示

    一个拼接的完整过程

    7.4文章查看四

    7.4.1日期格式的修改

    [
    'attribute'=>'create_time',
    'value'=>date("Y-m-d H:i:s",$model->create_time),
    ]

         detailview的template属性可以调节小部件中一行的模板,我们可以设置th标签的属性来改变这一列的宽度。

    7.5修改页面一:查询数据

    7.5.1下拉菜单(AR的find方法,command对象方法, QueryBuilder)

    ActiveForm让表单和模型结合起来,充分利用了模型的数据规则,让表单的验证代码几乎不
    用写。同时,activefield简化了表单input元素的编写,极大的减轻了表单开发工作量,
    同时让表单代码的可读性和可维护性提高。

    public $this dropDownList ( $items, $options = [] )
    下拉菜单dropdownlist就是其中一种,这是参考手册的介绍,dropdownlist有2个参数,第
    1个items是1个键值对构成的关联数组,其中键对应下拉菜单中的value,数组中的值对应
    下拉菜单中的选项。
    另1个参数options是1个由键值对组成的关联数组,这个表列出了这些键值对的用途。我们
    会用到第1个prompt键,prompt键对应的值是来设置下拉菜单的提示的字符串。
    第一种方法:
    第1种方法,
    使用find方法取出对象数组,用ArrayHelper的map转换为下拉菜单需要的格式就可以了。
    $allStatus = Poststatus::find()->all();
    然后用ArrayHelper的静态方法map把psOjbs这个对象数组进行转换,转换为键值对数组,也就是下拉菜单需要的键值对数组格式。
    用allstatus来替换这些硬编码。

    第二种方法:

    使用command对象来取数据。
    $sts = Yii::$app->db->createCommand('SELECT id,name FROM poststatus')-
    >queryAll();
    command对象执行查询后返回的是多维数组,同样可以用arrayhelper的map静态方法来转换,这就得到键值对数组作参数。
    刷新看到,也是我们需要的下拉菜单。

    第三种方法:

    querybuilder查询构建器是建在 DAO 基础上,这样创建的SQL语句,比原生SQL语句更易读、更安全。

    7.5.2 数组助手类 Array Helper

    里面含有的方法:

    获取值getValue        获取值

    获取列getColumn    从多维数组或对象数组中获取某列的值

            建立映射表map        map方法可以从一个多维数组或1个对象数组中取出数据,建1个新映射表

    command对象执行查询后返回的是多维数组,同样可以用arrayhelper的map静态方法来转

    换,这里就得到键值对数组作参数。

    7.5.3QueryBuilder

    总得思路:
    第1步是构建查询,首先创建1个 yii\db\Query 对象来代表1条 SELECT SQL 语句,
    然后通过调用一套可以串起来的方法,比如select方法,from方法,where方法等这些方法,构建出可以满足指定要求的查询条件。
    第2步是执行查询,执行Query 构建出来的查询条件,可以执行的查询方法有很多,比如
    有all方法取出所有数据,one方法取第1条数据,column方法取第1列数据等等

    7.5.4相关函数

    select方法是用来指定要取哪些字段,代表要取id和email2个字段的值,还可用addSelect方法来附加字段

    from来指定要从哪张表拿数据

    where方法用来设定查询条件,写法也灵活,可以字符串形式,键值对数组形式,也可以是操作符形式

    orderby,可以用键值对数组的键来表示需要排序的字段,其值来设定升序或降序

    limit和offset的写法,比如:从第20条开始取数,取10条记录

    indexBy:indexBy(id)来让id这一列的值作为索引值,也就是数组的键。

    groupBy having:可以用addgroup添加分组字段,having用来设置分组过滤的条件,可以用andHaving() orHaving() 来添加条件。

    join用来做表的连接查询,比如这条sql语句,可以写成这样。在参数设定了连接类型,还有
    连接表,连接条件,如果需要的话,这里还有连接条件的参数绑定,这是为了预防sql注入的。
    union用来联合2个不同的查询。

    all()方法执行后,可以得到多个多维数组,第1维是1个普通的索引数组,每1
    项对应从数据表中查询出来的一行。这些行就是第2维,是一个由字段名和值构成的键值对

    数组。

    one()把all换成one() 方法看看,这里返回的是第1条记录,这里就不是1个多维数组,只是1个

    键值对数组。

    column(),返回的是1个索引数组,由数据库中的第1列数据组成。
    scalar(),返回第1行第1列的数据,这是个字符串。

    count(),返回记录条数,是1个整数。

    7.5.5三种方法对比

    AR的find方法,本质上也是用查询构建器来构建查询,返回的是对象.

    Command对象:返回数组

    Query对象:可程序化构建,DBMS无关,易读,更安全,他的返回值是多个多维数组。

    7.6修改页面二

    7.6.1新建修改时间方法一

    方法一:当文章改提交后,就会看到最后修改时间确实就是当前时间,没问题。新
    增文章也一样,实例化出文章对象model后,我们只要先把对象的createtime和updatetime

    两个属性,都赋值为当前时间就可以了。

    7.6.2新建修改时间方法二

    AR的生命周期

     

    对新增时间和修改时间的设置,最合适的地方法就是beforeSave()这个方法,在提交的数据保存之前,把这个2个值设好,就实现了时间的自动设置。

    来代码中看看如何重写beforeSave方法:
    public function beforeSave($insert)
    $instert 是来区别对象的记录写⼊数据库时,是新增还是修改。
    if (parent::beforeSave($insert)) {
    一定要先调用父类的beforeSave方法,保证这个方法原有的代码先被执行,然后再执行
    我们写的代码。
    $this->create_time=time();$this->update_time=time();
    新增的时候,2个时间都赋值,这2句只会在新增时被执行一次。
    else $this->update_time=time();
    以后发生修改,只会改变最后修改时间。
    这样就完成了修改。

    7.6.3AR的其他方法

    7.7页面修改三

    7.7.1tags的修改的需求

    需求:

    当这篇文章新增到数据库以后,这张表的数据就会发生变化,先看看表中有没有yii2这个标签,
    有的话就加1,再看看第2个标签“小部件”,也有,就加1. 再看看第三个widget,发现表中没

    有这个标签,那么就新增一条记录。

    7.7.2tags修改思路

    7.7.3updateFrequency的调用

    7.8管理页面完善一

    7.8.1管理页面需求

    PostSearch搜索类DataProvider数据提供者GridView数据小部件

    7.8.2GridView数据小部件

       要创建一个GridView,也是通过一个键值对数组来进行配置的,键值对包括:

        • dataProvider 键指定提供数据的数据提供者。
        • filterModel 键指定一个能够提供搜索过滤功能的搜索模型类。
        • columns 键来指定需要展示的列,以及展示的格式

    7.8.3GridView之columns

        • 序号列类: 用来产生行号的,从 1 起始并自动增加;
        • 数据列: 用于显示数据
        • 动作列: 显示动作按钮,如查看、更新、删除操作,我们讲到评论管理的时候,会增加一个审核的按钮,到时会详细介绍动作列这个类。

        • 复选框列: 用来显示一个复选框列

    7.8.3.1columns之数据列

    这里列出了几个经常改动的键,
    attribute 指定需要展示的属性
    label 标签名
    value 值
    format 格式
    filter 自定义过滤条件的输入框
    contentOptions 设定数据列的HTML属性

    7.8.4ActiveDataProvider

    • 可以获取数据,并提供给其他组件或页面使用
    • 可将获取到的数据进行分页和排序
    • 经常用来给数据小物件提供数据,方便用户互动地进行数据的分页与排序

    • 实现了 yii\data\DataProviderInterface 接口类

    DataProvider根据获取数据的方式不同,有这3种类型:
    ActiveDataProvider是通过查询构建器的方式从数据库取数据。
    SqlDataProvider通过sql语句从数据库拿数据
    ArrayDataProvider由数组提供数据。

    7.8.4.1接口类方法-排序与分页

    getPagination,是读出分页对象信息的,可以看到,我们设置的pagesize=6.
    getSort,这些是显示哪些属性可以用来排序,以及支持用哪些顺序来排。 
    defaultorder是显示默认的排序字段和排序方式
    getCount 是当前页的数据条数。
    getTotalCount 则是所有记录的条数。
    分别是6和11,都没问题。
    我们主要通过配置pagination和sort来设定数据提供者的分页和排序的设定。
    还要补充一个车常用方法getmodels,这个方法就是把数据提供者中的数据取出来。

    7.9管理页面的完善二-PostSearch

    此处的主要作用就是用来根据输入的作者的姓名进行搜索与排序

    7.9.1gridview

    gridview会根据PostSearch和Post的属性名,把表单的输入项和数据的展示项一一对

    应起来。比如:id这一列数据,对应的表单就是PostSearch类中的id属性。
    如果我们把搜索类换成comment,gridview就会看看comment有哪些属性,
    然后和下面的数据展示列对应,发现除了status,其他都对不上,所以只能能把status展示出
    来。 

    7.9.2根据属性查询

    既然要用作者姓名来查询,用authorid只能按id查,那我们能

    不能给PostSearch类额外增加一个属性authorName,然后用这个属性来实现按字符串查询

    姓名。

    之后还要在postsearch里面进行添加authname的属性与验证规则rules

    7.9.3PostSearch类的Rules

    现在给我们增加的属性authorName,加上1个验证规则,可以认为提交的数据是安全的。

    7.9.4重点搜索

    第1句,构建了1个查询。

    第2句,数据提供者dataprovider把数据、分页、排序都封装了好。

    第3句,作为结果返回dataprovider。

    load进行块赋值(是使用的输入的数据)

    7.9.5属性name进行搜索

    1.赋值:使用load进行输入name属性

    2.使用join命令连接关联表adminuse与post文章表格进行连接

    3.进行like比对使用andfilterwhere命令

    7.9.6对于dataprovider进行排序

    添加排序的小插件即可

    7.9.7总结

    8.后台完善评论管理

    8.1评论管理页面的完善

    需求
    3. 评论内容的长短不一,看起来不方便,考虑截取评论前面一小段来展示。
    9. 把待审核的评论排在排前面,并用不同底色区别。
    10.添加一个审核按钮,可以对评论进行审核。
    11.显示待审核评论条数的气泡。

    8.2匿名函数$Value

    函数简介

    关于这段,用匿名函数来设置value的写法,我们可以查看参考手册:
    -value可以用匿名函数或字符串来设置,
    -匿名函数用这样的格式,我们用到的model,指的是当前行的数据对象,key 是当前行的
    键,index是当前行的索引值,column是数据列对象。
    例子中,我们只用到model,在渲染每一行的时候,我们会把当前的对象的content值取出来,
    进行截取处理,然后再作为结果提供给gridview渲染页面。

    8.3模型类的getter和setter方法

    使用方法

    先看看语法格式:
    getter方法的方法名以 get 开头,get后面的部分就是属性的名字。
    setter方法名以 set 开头。 get后面的部分就是属性的名字。
    定义好方法后,就可以像普通属性一样使用。但是本质有区别:当这种属性被读取时,对应
    的 getter方法将被调用;而当属性被赋值时,对应的 setter 方法就调用。
    如果只定义了 getter 方法,但没有定义setter方法,那么属性是只读属性,只能读不能
    写,对它赋值会抛出异常。多数情况下,我们都是定义只有getter方法的只读属性,这种属性一般不会持久化保存,
    多数是一个业务逻辑需要的计算结果。

    8.4bootstrap

    8.4.1全局css样式

    要重点理解栅格系统,它把页面分成12个单元,你可以通过设置单元格数,来把页面进行分
    栏:
    比如这里,左边占8个单元,右边占4个。对应代码就这样写。
    也可以分3栏,每栏4个单元。这是对应的代码
    博客的前台页面就分成了2个栏,左边是9,右边是3。
    

    8.4.2组件

    先看字体图标,有许多很漂亮很常见的图标,这就是我们选用的审核按钮,这是class属性,
    使用很简单,我们只需要把这段代码的class属性改成我们需要的图标属性就可以了。
    还有标签,通过<h+数字>这种形式可以控制标签的大小,用label+一个代表场景的英文单
    词,就可以设置不同的颜色。我们的标签云就是用到这2个属性来控制颜色和大小的。
    徽章,我们会⽤它来做待审核评论条数的气泡。使用也非常简单。

    8.4.3JavaScript 插件

    JavaScript 插件使用起来很简单,不需要去编写调试大量的js代码,就可以给网页带来很酷
    的用户体验。

    8.5评论审核功能的修改完善

    8.5.1需求

    先来看看,如何把待审核的评论排在排前面,并用不同底色区别。

    8.5.2思路

    1.排序我们先设定好排序,状态按正序排列,待审核的排前面,相同状态的再按id来倒序排,新发
    表的评论排前面。可以看到,待审核状态的排到了前面,相同状态里面,进一步是按id倒序
    排的。
    2.通过contentOptions来给状态列的css样式进行设置,设置待审核的数据格有不同的
    底色进行区分。
    这时候,要用到匿名函数,在函数中判断当前对象的状态是否为“待审核”,如果是的话,
    我们就给数据单元格分配一个bg-danger类的样式。

    8.5.3代码

     

    添加审核按钮

    排序

    待审核变色显示

    第1步,先添加1个审核按钮。
    在gridview中,是actionColumn这个类来负责展示动作按钮。现在这个写法,也是1种简写,
    是最简单的配置情况,只展示查看、修改和删除按钮。
    下面,我们来看看如何对这个类进行定义,
    template
    用template 来定义动作列中有哪些按钮,大括号内括起来的就是按钮,按钮的功能靠控制器
    中的动作来实现,按钮的命名要对应控制器中动作的 actionID。
    比如view这个按钮,对应的就是控制器中文章查看的动作:activeView
    默认情况时,只有前面3个按钮。我们现在要增加1个审核按钮,那么就在原先的基础上添
    加1个新的按钮approve。
    buttons
    添加以后,还需要buttons来进1步设置这个按钮:
    用按钮名来作为键名,值为按钮的渲染回调函数,这里只需要对approve来进行设定,其他
    的查看,修改和删除按钮已经默认设置好的,如果感兴趣,可以去追踪源码看看:
    protected function initDefaultButtons(){
    if (!isset($this->buttons['view'])) {
    $this->buttons['view'] = function ($url, $model, $key) {
    $options = array_merge([
    'title' => Yii::t('yii', 'View'),
    'aria-label' => Yii::t('yii', 'View'),
    'data-pjax' => '0',
    ], $this->buttonOptions);
    return Html::a('<span class="glyphicon-eye-open"></span>', $url, $options);
    };
    }
    这就是对评论查看按钮的设置,这还用到了yii的t方法,用来翻译成其他语言,比如这是
    view,因为我们设定的语言是中文,所有你看到的提示是查看。
    好了,回来继续approve,这是回调函数参数的说明,title和label不⽤翻译,直接写中文,
    data-confirm可以在点击这个按钮时弹出个提示框,最后,返回的html代码用到了bootstrap
    中的图标check。这样就写好按钮的回调函数。
    此外,还要补充1个不是很常见的属性controller,如果按钮对应的动作是在别的控制器中,
    那么就通过controller来指定那个控制器,否则默认就是当前的控制器。
    好的,我们到代码里面来实现审核按钮,保存刷新后,图标出来了,点来看看,404没有网页
    ,因为我们还没有在控制器中写对应的动作方法。
    第2步,到控制器中来写1个approve的动作,我们知道控制器的代码总是很简单的,有什
    么具体任务让模型做,做完后看看哪个视图来渲染。
    先把需要审核的对象找出来,然后让模型去按业务需求完成审核工作,这里能不需要特别的
    审核页面,审核页面是改变一下状态,所以页面还是回到评论管理,也就是index这个页面就
    可以了。
    第三步,是去模型⽂件去实现审核这个业务需求,这个需求⾮常简单,就是把评论的状态从1
    改为2,2代表已审核,返回1个布尔值,保存成功就返回true,这样就可以了。
    看看效果,点审核时会有个提示,确定后就会去执⾏审核的代码,执⾏完后,还是回来这个
    页面。这时候刚才那条就已经审核通过了。



    控制器

    模型

    8.5.4导航栏加个气泡

    用来显示待审核的评论条数

    8.5.4.1控制器

    8.5.4.2视图

     使用bootstrap进行加载气泡的css样式

    第九部分 后台完善用户管理

    9.1用户管理需求

    1. 认证
    2. 前后台认证的分离
    3. 用户管理页面的完善
    4. 授权

    9.2简述

    认证是鉴定用户身份的过程。通常是使用用户名和密码来鉴别用户身份。认证是登录功能的基础。

    Yii框架是用用户组件 yii\web\User 来管理用户的认证状态。分2个步骤来实现认证
    1. 先给用户组件 yii\web\User 指定1个含有实际认证逻辑的认证类。比如:app\models\User

    2. 让认证类user类实现 yii\web\IdentityInterface (相当于验证方法)这个接口,接口包括这几个方法。

    9.3思路与步骤

    9.3.1控制器

    
     
    登录页面,在sitecontroller的actionlogin方法里面。
    第一步
    第1句判断,先看看你是不是没有进入系统的游客,如果是已经登录进去的账户,那就不要
    来登录口这里玩,让他去到首页那里玩,isGuest这部分稍后还会进1步介绍。以下为代码展示
    第二部
    接下来新建1个loginform对象,loginform是1个模型类,对应的是登录表单,也有1般模
    型类都有的属性,验证规则,还有业务逻辑。
    第三步
    回来控制器,这里是块赋值,通过LoginForm对象拿到用户提交的数据,然后调用表单模型的login方法。
    login方法如果执成功,就代表验证就通过,调用goBack返回到登录前的页面就可以了。否则依然停在登录页面,让你继续提交用户名和密码。
    我们看到,是否能验证通过,关键点在表单类model的login方法这里,这里执行成功,验证就通过了。
    

    9.3.2LoginForm

    表单类的login方法,主要有2个步骤:
    1.第1步,模型类的validate方法,是看看表单提交的数据是否符合这些数据规则。
    2.第2步,如果符合规则,接下就会执行Yii::$app->user->login()这句,这1句表示验证已
    经成功,注册进入系统,这1句稍后会再解释。

     

    9.4前后台认证分离

     

    9.4.1分离步骤

    9.4.2代码操作

    修改对应adminuser的模型

    9.4.3共用session连接

     

    内容选择魏曦教你学

    展开全文
  • Yii2基本使用汇总

    2019-07-23 15:43:07
    安装yii2初级程序 composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic 安装yii2高级模板程序 composer global require "fxp/...

    安装

    安装yii2初级程序

    composer global require "fxp/composer-asset-plugin:^1.2.0"
    composer create-project --prefer-dist yiisoft/yii2-app-basic basic

    安装yii2高级模板程序

    composer global require "fxp/composer-asset-plugin:^1.2.0"
    composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application
    /path/to/php-bin/php /path/to/yii-application/init

    详情参考GitHub官网

    通过composer.json安装扩展

    composer install

    更新本地composer扩展库

    composer update

    直接安装某个composer扩展

    composer require [options] [--] [vendor/packages]...

    DAO

    Yii的数据库读取对象,在PDO之上,DAO后有了Query Builder和AR

    基本使用方法

    获得数据库连接

    $conn = Yii::$app->db;

    执行数据库查询语句

    Yii::$app->db->createCommand("SELECT * FROM `user`");
    Yii::$app->db->createCommand("SELECT * FROM `user` WHERE uid=:uid",[":uid"=>1]);
    Yii::$app->db->createCommand("SELECT * FROM `user` WHERE uid=:uid")->addValue([":uid"=>1]);

    SQL语句插入数据

    Yii::$app->db->createCommand('INSERT INTO user (email, password) VALUES("test3@example.com", "test3");')->execute();

    数组形式插入数据

    Yii::$app->db->createCommand()->insert('user', [
        'email' => 'test4@example.com',
        'password' => 'changeme7',
        'first_name' => 'Test'
    ])->execute();

    批量插入数据

    Yii::$app->db->createCommand()->batchInsert('user', ['email', 'password', 'first_name'],
    [
    ['james.franklin@example.com', 'changeme7', 'James'],
    ['linda.marks@example.com', 'changeme7', 'Linda']
    ['roger.martin@example.com', 'changeme7']
    ])->execute();

    更新数据

    Yii::$app->db->createCommand()->update('user', ['updated_at' => time()], 'id = 2')->execute();

    删除数据

    Yii::$app->db->createCommand()->delete('user', 'id = 3')->execute();

    获取结果方法

    获取所有数据(数组形式返回)

    Yii::$app->db->createCommand("SELECT * FROM `user`")->queryAll();

    获取一条数据(一维数组)

    Yii::$app->db->createCommand("SELECT * FROM `user` WHERE id = 1")->queryOne();

    获取一个值

    Yii::$app->db->createCommand("SELECT count(*) AS total FROM `user` WHERE id = 1")->queryScalar();

    获取某一列(放到一位数组中)

    Yii::$app->db->createCommand("SELECT username FROM `user`")->queryColumn();

    Logging

    日志功能

    基本用法

    trace

    Yii::trace($message,$category) //记录一条消息去跟踪一段代码是怎样运行的。这主要在开发的时候使用。

    info

    Yii::info($message,$category) //记录一条消息来传达一些有用的信息。

    warning

    Yii::warning($message,$category) //记录一个警告消息用来指示一些已经发生的意外。

    error

    Yii::error($message,$category) //记录一个致命的错误,这个错误应该尽快被检查。

    Validator

    数据验证,最常用于模型的rules()函数

    方法列表(Model中rules函数)

    required 必须值

    ["username",'required']
    [["username","email"],'required']
    [["username"],'required',"message"=>"{attribute}必须填写"]
    [["username"],'required','requiredValue'=>"abei"] //用户填写的值必须等于requiredValue才能通过验证。

    Email验证

    ["email",'email']
    [["email","work_email"],'email']

    Boolean验证

    ['sex', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]; //可以认为置顶 true / false 值。

    captcha验证码

    ['verificationCode', 'captcha'];

    compare比较

    ['username', 'compare', 'compareAttribute' => 'province','message'=>'username和province必须一样'] //错误信息将提示给username
    ['age', 'compare', 'compareValue' => 30, 'operator' => '>=','type' => 'number'];//compareValue:比较常量值 operator:比较操作符 type为值类型,默认为string,会一个每个字符对比,若为number则直接判断数值
    //operator 待选值==、===、!=、!==、>、>=、<、<=

    date验证

    ["birth","date","format"=>"Y-m-d"]

    default验证

    ['age','default','value'=>null] //当age为空的时候设置为null
    ['country','default','value'=>'USA'] //当 country为空时设置为USA
    /* 如果from为空,则=今天+3天,如果to为空,则=今天+6天 */
    [['from','to'],'default','value'=>function($model,$attribute){
        return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
    }]

    double/number验证

    ['v','double'] //判断v是否为数字
    ['v','double','max'=>90,'min'=>1]//判断v是否为数字且大于等于1、小于等于90

    数组各元素验证

    ["categoryIds","each","rule"=>['integer']]

    exist是否存在验证

    /* 所谓对存在的检查实质为where的与操作,必须同时瞒住的记录存在方可。兄弟们可以研究下,exist是对sql语句EXISTS的应用*/
    ["username","exist"] //username输入的值已经存在
    ["username","exist","targetAttribute"=>"province"] //username的输入值必须在province列存在
    ["username","exist",'targetAttribute' => ['username', 'province']] //username的输入值必须在username和province中存在
    [["username","province"],"exist",'targetAttribute' => ['username', 'province']] //username和province的输入值必须在username和province中存在

    file验证

    /* maxFiles代表一次最多传几个,mimeTypes代表上传文件类型 */
    ['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'],'mimeTypes'=>["image/*"], 'maxSize' => 1024*1024,'minSize'=>100*1024,'maxFiles'=>6,'checkExtensionByMimeType'=>true],

    filter过滤验证函数

    [['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true],
    ['phone', 'filter', 'filter' => function ($value) {
            //normalize phone input here
            return $value;
    }],

    image验证

    /* 上传png/jpg格式,最大宽度不能超过1000px,最小宽度不能低于100px,最大高度不能高于1000px。最小高度不能低于100px */
    ['primaryImage', 'image', 'extensions' => 'png, jpg','minWidth' => 100, 'maxWidth' => 1000,'minHeight' => 100, 'maxHeight' => 1000]

    ip验证

    ["ip_addess","ip"]

    in方法验证

    ["level","in","range"=>[1,2,3]]

    integer验证

    ["age",'integer'];
    ["age","integer","max"=>90,"min"=>1]

    正则匹配验证

    ["username","match","pattern"=>"/^[a-z]\w*$/i"]

    safe验证(多用于设置一个model的attribute)

    ["description","safe"]

    string验证

    ["username","string","length"=>[4,24]];
    ["username","string","min"=>4];
    ["username","string","max"=>32];
    ["username","string","encoding"=>"UTF-8"];

    unique唯一验证

    ["username","unique"]
    ["username","unique","targetAttribute"=>"province"]

    url验证

    ["website","url"]
    ["website","url","validSchemes"=>["http","https"]]

    Session&Cookie

    Session被封装成一个应用组件,直接通过Yii::$app->session来访问;Cookie通过Request和Response来操作。

    Session

    获得session

    $session = Yii::$app->session;

    检查session是否开启

    Yii::$app->session->isActive

    开启一个session

    Yii::$app->session->open()

    关闭session

    Yii::$app->session->close();

    销毁session中所有已注册的数据

    Yii::$app->session->destroy();

    访问一个session

    /* 以下三种方法效果等同 */
    $language = $session->get('language');
    $language = $session['language'];
    $language = isset($_SESSION['language']) ? $_SESSION['language'] : null;

    设置一个session

    /* 以下三种方法效果等同 */
    $session->set('language', 'en-US');
    $session['language'] = 'en-US';
    $_SESSION['language'] = 'en-US';

    删除一个session变量

    /* 下面三种方法效果等同 */
    $session->remove('language');
    unset($session['language']);
    unset($_SESSION['language']);

    检查一个session变量是否存在

    /* 以下三种方法效果一致 */
    if ($session->has('language')) ...
    if (isset($session['language'])) ...
    if (isset($_SESSION['language'])) ...

    Cookie

    获取cookie

    $cookies = Yii::$app->request->cookies;

    设置cookie

    $cookies = Yii::$app->response->cookies;

    获取一个cookie值

    $language = $cookies->getValue('language', 'en'); //如果获取language失败,则返回"en"代替

    另一种获取cookie值方法

    if (($cookie = $cookies->get('language')) !== null) {
        $language = $cookie->value;
    }

    数组方式获取cookie值

    if (isset($cookies['language'])) {
        $language = $cookies['language']->value;
    }

    检查一个cookie是否存在

    if ($cookies->has('language')) ...
    if (isset($cookies['language'])) ...

    新增一个cookie

    $cookies->add(new \yii\web\Cookie([
        'name' => 'language',
        'value' => 'zh-CN',
    ]));

    删除一个cookie

    $cookies->remove('language');
    unset($cookies['language']);

    Request

    Request 被配置为一个应用组件,我们可以通过Yii::$app->request访问它。

    URL相关

    获得当前请求的绝对url

    Yii::$app->request->getAbsoluteUrl();

    返回一个请求URL的hostInfo部分

    Yii::$app->request->getHostInfo();

    获得URL问号后的参数字符串

    Yii::$app->request->getQueryString()

    返回服务器端口

    Yii::$app->request->getServerPort();

    HTTP头

    返回用户接受的内容类型

    Yii::$app->request-> getAcceptableContentTypes (); //Header Accept

    返回用户可接受的语言

    Yii::$app->request-> getAcceptableLanguages(); //Header Accept-Language

    返回GET/POST请求

    Yii::$app->request->get();
    Yii::$app->request->get("id");
    Yii::$app->request->POST();
    Yii::$app->request->POST("username");

    判断请求类型(返回boolean)

    Yii::$app->request->isAjax //判断是否为ajax请求
    Yii::$app->request->isConsoleRequest //判断是否为控制发起的请求
    Yii::$app->request->isDelete //判断是否为DELETE请求
    Yii::$app->request->isGet //判断是否为GET请求
    Yii::$app->request->isPost //判断是否为POST请求
    Yii::$app->request->isPjax //判断是否为isPjax请求

    客户端信息

    返回用户的 IP

    Yii::$app->request->getUserIP();

    Response

    和Request一样,Response被封装成Yii的一个组件,你可以通过Yii::$app->response轻松的访问它。

    Status Code状态码

    设置一个Status Code

    Yii::$app->response->statusCode = 200;

    Yii内置的通过异常形式返回状态码

    yii\web\BadRequestHttpException: status code 400.
    yii\web\ConflictHttpException: status code 409.
    yii\web\ForbiddenHttpException: status code 403.
    yii\web\GoneHttpException: status code 410.
    yii\web\MethodNotAllowedHttpException: status code 405.
    yii\web\NotAcceptableHttpException: status code 406.
    yii\web\NotFoundHttpException: status code 404.
    yii\web\ServerErrorHttpException: status code 500.
    yii\web\TooManyRequestsHttpException: status code 429.
    yii\web\UnauthorizedHttpException: status code 401.
    yii\web\UnsupportedMediaTypeHttpException: status code 415.

    抛出其他Status Code

    throw new \yii\web\HttpException(402); //如果系统没有,可以通过HttpException自己写状态码
    throw new \yii\web\HttpException(402,"message");

    HTTP Headers

    添加设置删除Http Headers内容

    $headers = Yii::$app->response->headers;

    add a Pragma header. Existing Pragma headers will NOT be overwritten.

    $headers->add('Pragma', 'no-cache');

    set a Pragma header. Any existing Pragma headers will be discarded.

    $headers->set('Pragma', 'no-cache');

    remove Pragma header(s) and return the removed Pragma header values in an array

    $values = $headers->remove('Pragma');

    Response Body

    相应主体

    Yii::$app->response->content = 'hello world!';

    ActiveForm

    重点!列出最常用的ActiveForm方法。

    Html

    通过Html类的一些静态方法生成Html标签。

    生成Html标签方法

    生成一个超级链接

    Html::a('链接的文本', $url);

    通过Yii2的路由生成一个链接

    Html::a('链接文本', Url::to(['/site/index'], true));
    Html::a('链接文本', Yii::$app->urlManager->createUrl(['/site/index']));

    生成一个图片链接

    Html::img("/images/logo.png",['class'=>'img']);

    生成一个按钮

    Html::button("按钮文本",['class'=>'button-action']);

    发送邮件链接

    Html::mailto("阿北",'abei@nai8.me',$options);

    生成有序列表

    $list = ['china','usa'];
    Html::ol($list);

    生成无需列表

    $list = ['china','usa','japan'];
    Html::ul($list);

    生成javascript代码

    Html::script("alert('hello world');")

    生成style代码

    Html::style("color:#F60");
    Html::style(".list {background:#FFF;}");

    文件引用及编码

    生成一个css引用链接

    Html::cssFile("http://baidu.com/style.css",[]);

    生成一个js文件引用

    Html::jsFile($url,[]);

    把字符 "<" (小于)和 ">" (大于)转换为HTML实体

    Html::encode($html);

    将特色的HTML实体转化为>和<

    Html::decode($string);

    Alias

    定义和使用

    定义一个别名

    Yii::setAlias('@baidu', 'http://www.baidu.com');

    获得一个别名

    Yii::getAlias($name);

    获得Yii框架所在的目录

    Yii::getAlias('@yii')

    正在运行的应用的根目录

    Yii::getAlias('@app')

    Composer第三方库所在目录

    Yii::getAlias("@vendor")

    bower库所在位置

    Yii::getAlias("@bower");

    npm库所在位置

    Yii::getAlias("@npm");

    运行时存放文件路径

    Yii::getAlias("@runtime");

    index.php所在目录

    Yii::getAlias("@webroot");

    当前应用的根URL,主要用于前端。

    Yii::getAlias("@web");

    高级版-通用文件夹

    Yii::getAlias("@common");

    高级版-前台应用所在位置

    Yii::getAlias("@frontend");

    高级版-后台应用所在位置

    Yii::getAlias("@backend");

    命令行库所在位置

    Yii::getAlias("@console");

    Query Builder

    主要解决DAO在查询语句上的繁琐问题,无需输入原生SQL语句就可以完成数据库检索。

    基本用法

    使用Query Builder需要使用的类

    $query = (new \yii\db\Query());
    //yii2使用Query对象来采集SQL的各个部分,然后由Query Builder组成SQL语句后由DAO发给数据库获得请求。

    SELECT方法

    $query->select("id,username"); //字符串形式
    $query->select(['id','username']); //数组形式
    $query->select(["userId"=>"id","fName"=>"user.frist_name"]); //起别名
    $query->select(["full_name"=>"CONCAT(id,'-',username)"]); //支持MYSQL函数

    FROM方法

    $query->from("user"); //字符串形式
    $query->from(["u"=>"user"]); //数据表别名

    过滤掉重复记录

    $query->select("username")->distinct()->from("user"); //distinct

    WHERE函数用法

    /* 传递字符串 */
    $query->where("id = 1");
    $query->where("id = :id")->addParams([":id"=>1]);
    $query->where("id = :id",[":id"=>1]);
    
    /* 传递数组 */
    $query->where(["username"=>"abei","age"=>[20,19,26]])->from("user"); //select * from user where username="abei" AND age in (20,19,26)
    
    /* 操作符 */
    $query->where([">","id",10]); //id > 10
    $query->where(["<","id",10]); //id < 10
    $query->where(["<>","id",10]); //id <> 10
    $query->where(["in","id",[10,12]]); //id in (10,20)
    $query->where(["not in","id",[10,12]]); //id not in (10,20)
    $query->where(["and","id=1","id=2"]); id=1 AND id=2
    $query->where(['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]]); //(type IN (7, 8, 9) OR (id IN (1, 2, 3)))
    $query->where(["between", 'id', 1, 10]); //id between 1 AND 10
    $query->where(["not",["id"=>5]]); //not (id=5)
    $query->where(["not between","id",1,10]); //id not between 1 AND 10
    $query->where(["like","username","abei"]); //username like "%abei%"
    $query->where([['like', 'username', ['abei', 'liuhuan']]]); //username like "%abei%" AND username like "%liuhuan%"
    $query->where(['like', 'username', '%abei', false]); //username like "%abei"
    $query->where(["or like", 'username', ['abei', 'liuhuan']]); //username like "%abei%" OR username like "%liuhuan%",只作用于范围为数组的形式
    $query->where(["not like",xxxxx]); //与like用法一致
    $query->where(["or not like",xxx]) //与not like用法一致

    一个要单独说明的exists

    /* EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False */
    $query->where(['exists', (new Query())->select('id')->from('user')->where(['id' => 1])]);

    ORDER BY 方法

    $query->orderBy("id DESC");
    $query->orderBy(["id"=>SORT_DESC]);
    $query->orderBy(["id"=>SORT_DESC,'create_time'=>SORT_ASC]);

    GROUP BY && HAVING

    $query->groupBy(["username"]);
    $query->groupBy(["id"])->having([">",'id',20]);

    获取生成的SQL语句

    $query->createCommand()->sql;

    获得查询结果

    获取所有结果

    $query->all(); //二位数组

    获取一条记录

    $query->one();

    检查一个数据库中是否含有某个表

    (new \yii\db\Query)->from('user')->exists();

    获取count

    $query->count();

    获取一个值

    $query->scalar();

    获取一列值

    $query->column(); //一位数组

    一个例子

    获取一个user表的内容

    $query = new \yii\db\Query;
    $query->from("user");
    $query->select(["fname"=>"username"]);
    $query->where([">",'id',10]);
    $query->all();

    FileHelper

    几个常用也好用的文件帮助方法

    基本方法

    // 遍历一个文件夹下文件&子文件夹
    FileHelper::findFiles('/path/to/search/');
    FileHelper::findFiles('.', ['only' => ['*.php', '*.txt']]); // 只返回php和txt文件
    FileHelper::findFiles('.', ['except' => ['*.php', '*.txt']]); // 排除php和txt文件
    // 获得指定文件的MIME类型
    FileHelper::getMimeType('/path/to/img.jpeg');
    // 复制文件夹
    FileHelper::copyDirectory($src, $dst, $options = [])
    // 删除一个目录及内容
    FileHelper::removeDirectory($dir, $options = [])
    // 生成一个文件夹(同时设置权限)
    FileHelper::createDirectory($path, $mode = 0775, $recursive = true)
    展开全文
  • Yii2入门教程(一)

    千次阅读 2019-03-09 21:26:28
    Yii2入门教程(一) 0.Yii2官方中文文档:https://www.yiichina.com/doc/guide/2.0/start-hello 1.安装方法请看: https://blog.csdn.net/Maybe922/article/details/88360605 2.安装完后,就开始熟悉这个项目了。 a....

    Yii2入门教程(一)

    0.Yii2官方中文文档:https://www.yiichina.com/doc/guide/2.0/start-hello

    1.安装方法请看: https://blog.csdn.net/Maybe922/article/details/88360605

    2.安装完后,就开始熟悉这个项目了。

    a.目录结构:
    在这里插入图片描述
    b.下面就是结合自己想法以及官方文档的例子进行讲解。
    本文假设开发者有点的MVC设计模式的基础。
    学习目的:
    (1)如何创建一个action去响应请求
    (2)如何创建一个view去构造响应内容,
    (3)以及一个应用如何分派请求给action。
    首先在项目基础上创建自己的控制器:controllers/HelloWorldController.php
    在创建controllers/HelloWorldController.php控制器之前,我们需要了解Yii框架的命名规范。
    控制器的action命名规范:
    action在请求时总是被以小写处理,如果一个action由多个单词组成, 单词之间将由连字符连接(如 hello-world)。 action映射为方法名时移除了连字符,将每个单词首字母大写,并加上 action 前缀。 例子:action: hello-world 相当于方法名 actionHelloWorld。如果是单个单词的话,则是actionIndex。
    控制器的命名规范:
    与action一样,一个应用中控制器同样有唯一的 ID。 Controller 和action 使用同样的命名规则。 控制器的类名源自于控制器 ID, 移除了连字符,每个单词首字母大写,并加上 Controller 后缀。 例子:controller: say-hello 相当于控制器类名 SayHelloController。
    URL说明:
    当我们要执行SayHelloController(控制器)里的actionHelloWorld(action)时,则请求的url为:
    http://localhost:801/web/index.php?r=say-hello/hello-world
    当我们要执行SayHelloController(控制器)里的actionIndex(action)时,则请求的url为:
    http://localhost:801/web/index.php?r=say-hello/index
    注意,这里主要看r后面的参数,上面 URL 中的参数 r ,它代表路由,是整个应用级的, 指向特定操作的独立 ID。路由格式是 controller/action
    执行上述url后,SayHelloController::actionHelloWorld() 方法将被调用处理请求。
    如果是带参数的话则是,例子:http://localhost:801/web/index.php?r=say-hello/index&message=Hello+ZXC

    创建controllers/SayHelloController.php控制器

    <?php
    
    namespace app\controllers;
     
    use yii\web\Controller;
    
    class SayHelloController extends Controller
    {
        public function actionIndex($message = 'Hello Index')
        {
            return $this->render('index',['message'=>$message]);
        }
    
        public function actionHelloWorld($message = 'Hello World')
        {
            return $this->render('index',['message'=>$message]);
        }
    }
    

    这里的render()方法是渲染index视图的意思。
    注:这里的index视图是对应在say-hello/index.php。这个say-hello是我们自己创建的目录,用于放置于SayHelloController有关的views。文件夹的取名规范也同url一样,小写,然后多个单词时用’-'来连接单词,单个单词直接建即可。
    在这里插入图片描述
    say-hello/index.php:

    <?php
    use yii\helpers\Html;
    ?>
    <?=Html::encode($message) ?>
    

    当我们请求:http://localhost:801/web/index.php?r=say-hello/index&message=Hello+ZXC时:
    在这里插入图片描述
    表示成功。
    以上,我们就算懂了如何创建Controllers和views了。

    展开全文
  • Yii框架的优点

    千次阅读 2018-02-07 10:41:33
    1. 易于安装 对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。 安装处理使用Composer。如果你想要描述安装的...(Yii模块是最好的描述,小应用驻留在主应用程序里面)。 注

    1. 易于安装

    对于web开发人员来说,时间就是金钱,没有人愿意把宝贵的时间花在一个复杂的安装和配置过程。

    安装处理使用Composer。如果你想要描述安装的过程,Sitepoint最近发表了一篇很棒的文章,在这儿。我倾向于使用基本的应用程序模板,即使我的网站有一个单独的前端和后端组件。相反,我选择使用一个模块给我的网站的后台部分。(Yii模块是最好的描述,小应用驻留在主应用程序里面)。

    注意:许多目录的引用在后面的示例中,从简单的模板去使用目录的结构。

    2. 利用现代技术

    Yii是一种纯粹的面向对象框架,并且利用PHP的一些更高级的功能,包括延迟静态绑定,SPL类和接口,和匿名函数

    所有的类名称空间,它允许你利用PSR-4兼容的自动装载器。这意味着包括Yii 的 HTML的帮助类一样的简单:

    1
    use yii\helpers\Html;

    Yii 也允许你定义别名来帮助简化你的命名空间。 在上面的示例中,  use 语句将加载一个类定义,默认放的目录 /vendor/yiisoft/yii2/helpers.  这个别名在BaseYii 类在第79行中定义:

    1
    public static $aliases = ['@yii' => __DIR__];

    框架本身的安装使用Composer,是其扩展。 甚至出版的过程扩展一样容易创建自己的 composer.json,并在Github托管代码,列出您的扩展在Packagist。

    3. 高度可扩展性

    Yii 看起来就像一件样式很棒的西装,但也非常容易根据你的需求来进行定制. 实际上框架的每一个组件都是可以扩展的。一个简单的示例就是添加一个唯一的主体ID到你的视图上。 (你如果对自己为什么可能会想要这样做感兴趣的话,可以看看这篇 文章).

    首先,我会在我的 app\components 目录相面创建一个名为 View.php 的文件, 并加入如下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace app\components;
      
    class View extends yii\web\View {
      
      public $bodyId;
      
      /* Yii allows you to add magic getter methods by prefacing method names with "get" */
      
      public function getBodyIdAttribute() {
        return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : '';
      }
      
    }

    然后,在我的主布局文件 (app\views\layouts\main.php) 中,我会将如下代码添加到我的HTML中body标签的里面:
     

    1
    <body <?=$this->BodyIdAttribute?>>

    而最后,我会加下列的代码添加到我的主配置文件中,以便让Yii知道如何去使用我扩展的视图类,而不是它自己默认的那个类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    return [
      // ...
      'components' => [
        // ...
        'view' => [
          'class' => 'app\components\View'
        
      ]
    ];

    4. 鼓励测试

    Yii 框架和Codeception框架紧密地集成在一起。 Codeception 是一个优秀的PHP测试框架,它帮助简化创建单元测试、功能验收测试的流程。 条件是你在为所有的应用程序编写自动化的测试用例,对吧?

    Codeception 扩展使得在测试时配置应用程序变得简单。 测试应用程序,只需编辑一个已存在的文件/tests/_config.php。例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    return [
      'components' => [
        'mail' => [
          'useFileTransport' => true,
        ],
        'urlManager' => [
          'showScriptName' => true,
        ],
        'db' => [
            'dsn' => 'mysql:host=localhost;dbname=mysqldb_test',
        ],
      ],
    ];

    使用上面的配置,需要注意下面一些事项:

    •     在功能验收测试期间,所有发送的邮件都会被写入一个文件中保存,而非真正地发送出去。
    •     测试时URL的格式是index.php/controller/action,而非/controller/action。
    •     测试时需要使用测试数据库,而非生产数据库。

    Codeception 内部存在一个特殊的模块,专门用于Yii 框架测试。 它在TestGuy类里添加了一些方法,保证功能测试时 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注册表单是否成功地创建了一个用户名为testuser的User对象,你可以这样做:

    1
    2
    3
    4
    5
    $I->amOnPage('register');
    $I->fillField('username', 'testuser');
    $I->fillField('password', 'qwerty');
    $I->click('Register');
    $I->seeRecord('app\models\User', array('name' => 'testuser'));


    5. 简化的安全方案

    安全性是任何web应用的重要组成部分,幸运的是Yii有许多很棒的特性能帮你减轻负担.

    Yii 带来了一个安全性 应用程序组件,它暴露了一些可以帮助可以用来创建一个更加安全的应用程序的方法. 其中一些相对而言更加有用的方法有:

        generatePasswordHash: 从一个密码和一个随机的盐值生成一个安全的哈希值. 这个方法会为你创建一个随机的盐值,然后使用PHP的 crypt 函数来根据所提供的字符串创建一个哈希值.

       validatePassword: 这是一个可以同 generatePasswordHash 搭配使用的方法, 并可以让你检查用户提供的密码是否同你存储的哈希值匹配.

       generateRandomKey: 可逆让你创建一个任何长度的随机字符串

    Yii 会自动对所有非安全 HTTP 请求方法 (PUT, POST, DELETE) 的可用CSRF令牌进行检查, 并将在你使用 ActiveForm::begin() 方法创建你的开发表单标签时生成并输出一个令牌值. 这个特性可以通过编辑你的主配置文件,包含下面的代码来禁用:
     

    1
    2
    3
    4
    5
    6
    return [
      'components' => [
        'request' => [
          'enableCsrfValidation' => false,
        ]
    ];

    为了堤防跨站脚本XSS的攻击,Yii提供了另外一个叫做 HtmlPurifier 的辅助类. 这个类有一个名为 process 的静态方法, 而它将会使用同名的 流行过滤器库 来过滤你的输出.

    Yii 也包含了随时就绪的用于用户认证和授权的类. 授权被分成了两个类型: ACF (访问控制过滤器) 和RBAC (基于角色访问的控制).

    两者中更加的是 ACF, 其实现是通过在你控制器的添加下列的 行为 方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    use yii\filters\AccessControl;
      
    class DefaultController extends Controller {
      // ...
      public function behaviors() {
        return [
          // ...
          'class' => AccessControl::className(),
          'only' => ['create', 'login', 'view'],
            'rules' => [
            [
              'allow' => true,
              'actions' => ['login', 'view'],
              'roles' => ['?']
            ],
            [
              'allow' => true,
              'actions' => ['create'],
              'roles' => ['@']
            ]
          ]
        ];
      }
      // ...
    }


    上面的代码会告诉 DefaultControllerto 让访客用户访问login和view的action, 而不是create这个action. (问号 ? 是匿名用户的别名, 而 @ 表示的是已经被授权的用户).

    RBAC 是一个可以在应用程序中指定那些用户可以执行特定的动作的强大方法. 它涉及为你的用户创建角色,为你的app定义权限,并然后为他们预期的角色使用这些角色. 如果你想要创建一个审核员(Moderator)的角色就可以使用这个方法, 并可以让所有分配到这个角色的用户可以对文章进行审核.

    你也还可以使用 RBAC 定义规则, 它可以让你在特定条件下针对你应用程序的某些方面进行授权. 例如,你可以创建一个规则让用户可以编辑他们自己的文章, 而不能修改由其他人创建的文章.

    6. 缩短开发时间

    大多数的项目都包含了重复的任务,没有人想把时间浪费在这些重复工作上面。Yii 提供了一些工具来帮助你在这些任务上花费更少的时间,把大多数时间都用在定制应用来满足你客户的需求上。

    其中最强大的一个工具就是“Gii”。Gii是一个基于web脚手架代码工具,它可以让你快速的创建一个代码模板如下所示:

    •     Models
    •     Controllers
    •     Forms
    •     Modules
    •     Extensions
    •     CRUD controller actions and views

    Gii是高度可配置的。你可以设置它只从一个特定的环境加载。简单的编辑web配置文件如下:

    1
    2
    3
    4
    5
    6
    7
    if (YII_ENV_DEV) {
      // ...
      $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1']
      ]
    }

    这确保了Gii只有设置了Yii的环境变量为(development)开发环境时才加载,并且只在通过本地环境访问的时候加载。


    现在,让我们来看看模型的生成:

    201573142815193.jpg (1366×914)

    表格名称使用了一个响应敲击就会显示的小窗口来尝试给出对你的模型将会关联的表格的猜测, 并且所有的域值输入框都会有一个翻转效果显示出来的提示,提醒你如何完成对它们的填写. 你可以在让Gii输出代码之前先进行一下预览, 而所有的代码模板都是完全可定制的.

    也有几个可以用于数据库迁移、消息翻译(I18N)以及生成用于自动化测试数据库道具的命令行辅助工具. 例如,你可以使用如下代码创建一个新的数据库迁移 文件:

    1
    yii migrate/create create_user_table

    这将会在 {应用目录}/migrations 创建一个新的看起来像下面这样的迁移模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php
      
      use yii\db\Schema;
      
      class m140924_153425_create_user_table extends \yii\db\Migration
      {
        public function up()
        {
      
        }
      
        public function down()
        {
          echo "m140924_153425_create_user_table cannot be reverted.\n";
      
          return false;
        }
    }

    如此假如说我想要想这个表添加一些列. 我就只要简单的将下面的代码添加到 up 方法中:

    1
    2
    3
    4
    5
    6
    7
    8
    public function up()
    {
      $this->createTable('user', [
        'id' => Schema::TYPE_PK,
        'username' => Schema::TYPE_STRING . ' NOT NULL',
        'password_hash' => Schema:: TYPE_STRING . ' NOT NULL'
      ], null);
    }

    然后为了确保我可以进行迁移的逆向操作,我就会编辑down方法:

    1
    2
    3
    4
    public function down()
    {
      $this->dropTable('user');
    }

    创建表格可能就是简单的设计到在命令行上运行一个命令:

    1
    ./yii migrate

    而删除表格是下面的这个命令:

    1
    ./yii migrate/down

    7. 很容易通过调整获得更好的性能

    所有人都知道一个慢吞吞的网站会造就许多心怀不满的用户, 因此Yii为你提供了一些工具来帮助你让应用程序获得更快的速度.

    所有的Yii缓存组件都扩展自yii/caching/Cache, 它能让你在使用一个公共API的同时选择任意某一个缓存系统. 你甚至可以同时注册多个高速缓存组件. Yii 当前支持数据库和文件系统缓存, 还有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache.

    默认情况下,如果你是使用的 Active Record ,那么 Yii 会额外运行一个查询来确定生成你模型的表的结构. 你可以通过像下面这样编辑你的主配置文件,对你的应用程序进行设置,以缓存这些表结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    return [
      // ...
      'components' => [
        // ...
        'db' => [
          // ...
          'enableSchemaCache' => true,
          'schemaCacheDuration' => 3600,
          'schemaCache' => 'cache',
        ],
        'cache' => [
          'class' => 'yii\caching\FileCache',
        ],
      ],
    ];


    最后,Yii有一个命令行工具可以便于对前端字段进行缩小化. 简单地运行下面的命令就可以生成一个配置模板:

    1
    ./yii asset/template config.php

    然后编辑该配置,指定你想要用那些工具来执行缩小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
      return [
        'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}',
        'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}',
        'bundles' => [
          // 'yii\web\YiiAsset',
          // 'yii\web\JqueryAsset',
        ],
        'targets' => [
          'app\config\AllAsset' => [
            'basePath' => 'path/to/web',
            'baseUrl' => '',
            'js' => 'js/all-{hash}.js',
            'css' => 'css/all-{hash}.css',
          ],
        ],
        'assetManager' => [
          'basePath' => __DIR__,
          'baseUrl' => '',
        ],
      ];

    接下来,运行这个控制台命令以执行压缩.

    1
    yii asset config.php /app/assets_compressed.php

    最后,修改你的web应用程序配置文件,使用压缩后的资源.

    1
    2
    3
    4
    5
    6
    'components' => [
      // ...
      'assetManager' => [
        'bundles' => require '/app/assets_compressed.php'
      ]
    ]

    注意: 你需要手动下载并安装这些额外的工具.

    展开全文
  • yii

    2018-11-07 17:23:42
    一. ...Yii框架中 form表单传值 无刷新操作删除 上传图片组件需要修改 Yii2.0搜索file_upload 修改Uploader.php中的$randNum = rand(1,9999) . rand(1,999); 修改图片存储地址 和显示地址 接...
  • Yii::app()介绍

    千次阅读 2017-09-13 09:34:53
    Yii框架是纯OOP面向对象的框架 这个框架在运行的时候,也就是一个应用被访问的时候,需要创建许多对象,这些对象 再调用许多相关方法,从而完成一次web请求 这个Yii::app() 是第一个被创建的对象,由这...
  • YII2框架详解

    万次阅读 2017-02-23 13:50:53
    yii2框架的安装我们在之前文章中已经提到下面我们开始了解YII2框架 目录篇: MVC篇: 入口文件路径: http://127.0.0.1/yii2/advanced/frontend/web/index.php 为什么我们访问方法会出现url加密呢? 我们找到...
  • yii2 开启dubug调试栏

    万次阅读 2015-12-17 11:37:17
    yii2 开启dubug调试栏 找到yii config目录下的web.php找到如下配置
  • Yii:获取根目录的方法

    万次阅读 2016-12-21 18:20:40
    在使用Yii做为图片服务器的时候,经常需要处理绝对路径。首先就要知道网站的根目录是什么。有下面3个方法:1、在index.php文件中使用dirname(__FILE__),并保存2、使用Yii::app()->basePath, 这个指向的是protected...
  • yii2获取用户get,post参数

    万次阅读 2017-01-17 14:49:06
    Yii::$app->request->get(); 第一个参数为 用户get请求的key,第二个参数是默认值,第二个参数选填; Yii::$app->request->queryParams; 得到的是数组 Post: Yii::$app->request->post(); 第一个参数为 ...
  • Yii里获取当前controller和action的id

    万次阅读 2012-09-07 18:21:41
    在控制器里 $name = $this->getId(); // controller $name = $action->id;...$name = Yii::app()->controller->id; // controller $name = $this->getAction()->getId(); // action
  • Yii1.x中,查询特定列为键(key)的数组,
  • Yii2获取当前程序执行的sql语句

    万次阅读 2018-05-08 09:00:32
    $query = model::find(); $dataProvider = new ActiveDataProvider([ 'query' =&gt; $query, 'pagination' =&gt; [ 'pagesize' =&gt; '25', ] ...
  • Yii 清理缓存

    万次阅读 2012-06-12 18:13:35
    Yii 清理缓存: html: ClearCache js: function clearCache() { $.get('../eng/index.php?r=site/clear&'+new Date().getTime(),function(){ alert('Clear eng cache ok.'); }); } php:...
  • yii2打印上次执行的sql语句

    万次阅读 2017-07-18 16:01:21
    $driver=Driver::find(); $driver->.........//执行的操作 $sql=$driver ->createCommand()->getRawSql(); var_dump($sql);die;
  • yii框架的404、500等异常处理

    万次阅读 2013-08-30 11:07:33
    当请求的页面不存在时,yii会抛出一个CHttpException的异常,异常code为404,那么yii中是怎么处理该类异常的呢,有下面三种方法: 1、啥也不用做,yii会自己处理 当抛出该类异常时,yii会默认去渲染framework/...
  • 如何开启YII系统默认的DEBUG

    万次阅读 2012-12-02 21:34:55
    'enableProfiling'=>YII_DEBUG, 'enableParamLogging'=>YII_DEBUG, 再将'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'leve
  • yii2 where in的用法

    万次阅读 2019-06-19 13:44:53
    //多个id放入数组中 $idStr = []; foreach ($roleData as $key =&gt; $value){ $idStr[] = $value['id']; } $roleEatlive = RoleEatlive::find() -&gt;where...
  • Yii2-保存数据库,获取最后添加的id

    万次阅读 2015-10-06 11:09:00
    1、You can get the last inserted ID like this...Yii::app()->db->getLastInsertId(); 2、If $model->id wouldn't work then use Yii::app()->db->getLastInsertId() or getPrimaryKey() 3、If your goal is to
1 2 3 4 5 ... 20
收藏数 36,789
精华内容 14,715
关键字:

yii