Yii2框架与项目

第一部分:需求


第二部分:初始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进行生成的

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属性改成我们需要的图标属性就可以了。
还有标签,通过这种形式可以控制标签的大小,用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('', $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连接


 
--------------------- 
作者:阿朗999 
来源:CSDN 
原文:https://blog.csdn.net/fujian9544/article/details/79567090 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(PHP-Yii2)