日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Yii框架与项目

發(fā)布時(shí)間:2024/9/19 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Yii框架与项目 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第一部分:需求

第二部分:初始Yii2

2.1結(jié)構(gòu)

2.2生命周期

上半部分創(chuàng)建了一個(gè)應(yīng)用主體,應(yīng)用主體明確了由哪個(gè)控制器去接管后面的工作。

第1步,發(fā)出url后,apache會(huì)執(zhí)行index.php這個(gè)文件,在Yii框架中,這個(gè)文件叫入口文件。
這個(gè)文件在web目錄下,執(zhí)行此文件件主要做2件事:
1. 讀取配置文件web.php
2. 配置文件的數(shù)據(jù)來(lái)實(shí)例化這個(gè)應(yīng)用主體。
應(yīng)用主體會(huì)控制接下來(lái)的整個(gè)生命周期,直到響應(yīng)出結(jié)果。應(yīng)用實(shí)體具體是什么,稍后詳
解。
第2步,應(yīng)?實(shí)體接下來(lái)要進(jìn)?路由解析,路由解析就是是根據(jù)url中的參數(shù)r, 來(lái)決定由哪些
代碼來(lái)完成用戶的請(qǐng)求。這一步先取得r的值。
第三步,在請(qǐng)求組件的幫助下,解析出路由。這個(gè)例?解析的結(jié)果就是要?jiǎng)?chuàng)建?個(gè)叫
SiteController的控制器的實(shí)例,并且執(zhí)行里面的actionIndex?法

下半部分是我們寫(xiě)的代碼,是按MVC來(lái)組織的代碼,下面的代碼就是在執(zhí)行mvc的步驟。

?

2.3入口文件

? 定義全局常量;

? 注冊(cè) Composer 自動(dòng)加載器;

? 包含 Yii 類文件;

? 加載應(yīng)用配置;

? 創(chuàng)建這個(gè)應(yīng)用實(shí)例并配置;

? 調(diào)?用yii\base\Application::run() 來(lái)處理請(qǐng)求。

2.4應(yīng)用主體

應(yīng)用主體是通過(guò)index.php進(jìn)行生成的

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

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

Yii::$app->charset

basePath :指定該應(yīng)用的根目錄
aliases :用一個(gè)數(shù)組定義多個(gè) 別名。數(shù)組的key為別名名稱,值為對(duì)應(yīng)的路徑。
components :這是最重要的屬性,它允許你注冊(cè)多個(gè)在其他地方使用的的應(yīng)用組件.
defaultRoute :該屬性指定缺省的路由規(guī)則,’defaultRoute’=>'site/about'

第三部分:控制器

3.1初識(shí)

3.2小知識(shí)

?控制器從yii\web\Controller類繼承來(lái)

$this是控制器對(duì)象本身,調(diào)的render(中文的意思是著色的意思)法(相當(dāng)于TP中的assign)

第四部分:視圖

4.1初識(shí)

4.2布局

第五部分:模型

5.1初識(shí)

5.2流程

5.3函數(shù)解釋

refresh就是讓頁(yè)面進(jìn)行刷新一次

5.4表單

  • 中間是通過(guò)調(diào)用ActiveForm::field() 方法來(lái)創(chuàng)建這個(gè)ActiveField 實(shí)例,這個(gè)實(shí)例會(huì)創(chuàng)建表單的input標(biāo)簽和JavaScript 驗(yàn)證。
  • ActiveField有對(duì)應(yīng)的模型和屬性,input 輸入框的 name 屬性會(huì)自動(dòng)地根據(jù)屬性名來(lái)創(chuàng)建;同時(shí),還會(huì)用屬性的驗(yàn)證規(guī)則(由js進(jìn)行驗(yàn)證)來(lái)驗(yàn)證用戶輸入的數(shù)據(jù)。
  • ActiveField如何進(jìn)行使用,就要參考手冊(cè)<?= $form->field($model,'email')?>

5.5塊賦值

表單生成的input中的name,實(shí)際是以對(duì)象名來(lái)命名的這個(gè)數(shù)組,數(shù)組的鍵和模型的屬性對(duì)應(yīng),提交的數(shù)據(jù)就是鍵對(duì)應(yīng)的值。 在模型那邊執(zhí)行l(wèi)oad方法,其實(shí)就是對(duì)每個(gè)屬性執(zhí)行這樣語(yǔ)句賦值: $model->name = isset($data['name']) ? $data['name'] : null;

5.6助手類HTML

前面按鈕的例子,就是用純html寫(xiě)就這樣。也可以用html 幫助類的submitButton方法來(lái)寫(xiě)。前面得div里面的

第六部分:博客原型

6.1別名

6.2配置文件

箭頭后面的是權(quán)利大的,不會(huì)被覆蓋掉,前面得會(huì)被覆蓋掉

6.3需求分析

?

6.4表結(jié)構(gòu)

分析表結(jié)構(gòu):

post表:對(duì)應(yīng)adminuser外鍵與poststatus外鍵

comment表:對(duì)應(yīng)commitstatus外鍵、user_id外鍵與post_id外鍵

tag表:單獨(dú)的tag標(biāo)簽用于記錄標(biāo)簽云

migration表:系統(tǒng)的yii自己產(chǎn)生的表

6.5Gii

6.5.1概念

Gii 是一個(gè)基于Web的代碼生成器,可以用來(lái)生成模型,控制器,表單,增刪查改等等這些

類或功能的代碼。Gii也叫腳手架程序,是一種輔助工具。

6.5.2配置

首先,要在配置main-local.php,配置Gii模塊開(kāi)啟,我們只要在瀏覽器上輸入這個(gè)網(wǎng)址,注意參數(shù) r=gii,這樣就可以使用Gii了。

6.5.3作用

Gil是可以個(gè)可以幫你寫(xiě)代碼的神奇工具。可以用來(lái)生成模型,增刪查改,控制器,表單,

模塊,擴(kuò)展這些代碼。

6.5.4模型類

1. 首先要我們填寫(xiě)數(shù)據(jù)庫(kù)表名,我們先創(chuàng)建文章的模型類,文章的表名是post, 2. 然后是模型類的類名,我們命名為post。 3. 然后是命名空間,這個(gè)是用common/models,因?yàn)檫@個(gè)類是前后臺(tái)共用的。 4. 其他的都用默認(rèn)值就可以了。 5. 點(diǎn)preview,預(yù)覽這個(gè)按鈕后,告訴你,將會(huì)在common/models這個(gè)目錄下生成Post.php的模型?件。 6. 可以點(diǎn)開(kāi)來(lái)粗略看看?件的內(nèi)容,這些就模型類的代碼。 7. 沒(méi)有問(wèn)題就可以點(diǎn)“生成“這個(gè)按鈕,告訴你已經(jīng)成功生成了Post模型?件。

模型文件主要包括以下內(nèi)容:

1.屬性:有屬性,屬性標(biāo)簽,數(shù)據(jù)規(guī)則,塊賦值這些東西。在ActiveRecord這塊也不會(huì)少,這些就是所謂的業(yè)務(wù)數(shù)據(jù)---屬性。

2.業(yè)務(wù)規(guī)則:模型類的業(yè)務(wù)規(guī)則,業(yè)務(wù)數(shù)據(jù)有些是必填項(xiàng),有些必須為字符串,有些字段必須為整數(shù)。title這些要求是字符串,并且不能超過(guò)128個(gè)字符。

3.屬性標(biāo)簽:

4.業(yè)務(wù)邏輯:其它幾個(gè)方法就是業(yè)務(wù)邏輯。里面用到的hasmany hasone這些?法,都是ActiveRecord這

個(gè)類提供的方法

6.5.5增刪改查

1.進(jìn)行增刪查改的代碼生成頁(yè)面,先要輸入模型類的類名,注意要把命名空間寫(xiě)全。先從文章Post開(kāi)始。 2.還要生成一個(gè)PostSearch這個(gè)類,這個(gè)類是用來(lái)進(jìn)文章搜索的,我們?cè)诤笈_(tái)完善文章管理那一章會(huì)詳細(xì)分析這個(gè)類。 3.接下來(lái)是控制器類,注意增刪查改功能是后臺(tái)的功能,我們把它放到backend目錄下的controllers目錄里面,類 名設(shè)為PostController。 4.再下來(lái),這里填寫(xiě)視圖模板文件存放的目錄。@app指的是當(dāng)前應(yīng)用的根目錄,注意這斜杠的方向,和命名空間是有區(qū)別的。 5.點(diǎn)預(yù)覽,可以看到,將要生成一堆文件。

?

第七部分:后臺(tái)功能完善

7.1文章查看一(連接數(shù)據(jù)庫(kù))

7.1.1代碼展示

1.文章查看控制器動(dòng)作

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

7.2文章查看模型動(dòng)作

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使用數(shù)據(jù)庫(kù)

1.定義:
2.使用yii\db\Connection鏈接
?這段代碼表示會(huì)創(chuàng)建一個(gè) yii\db\Connection 對(duì)象,并用這個(gè)對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。
3.使用yii\db\Command訪問(wèn)與操作
他的缺點(diǎn)也很明顯:
1. 不同數(shù)據(jù)庫(kù)系統(tǒng)的SQL語(yǔ)句會(huì)有些差別,因此無(wú)法做到代碼適用于多種數(shù)據(jù)庫(kù)系統(tǒng)。
2. 用數(shù)組保存結(jié)果,而沒(méi)有用到面向?qū)ο蟮姆绞絹?lái)管理數(shù)據(jù),這樣就失去了許多面向?qū)ο?br /> 開(kāi)發(fā)的好處。
3. 不安全,如果不小心,會(huì)留下SQL注入這種不安全的因素,比如你不是通過(guò)綁定,而是直

Yii通過(guò)數(shù)據(jù)庫(kù)訪問(wèn)對(duì)象(Database Access Objects,簡(jiǎn)稱DAO)來(lái)使用數(shù)據(jù)庫(kù)。DAO是建立在 PDO 之上的,一套面向?qū)ο蟮姆绞絹?lái)訪問(wèn)數(shù)據(jù)庫(kù)的API。

我們之前連接數(shù)據(jù)庫(kù),就是在main-local配置文件中,這樣寫(xiě)就可以連上數(shù)據(jù)庫(kù)。

?這個(gè)對(duì)象的寫(xiě)法: Yii::$app->db,等下查詢數(shù)據(jù)時(shí)就會(huì)用到這個(gè)對(duì)象。

?

?

接把$_GET[‘id’]寫(xiě)到sql語(yǔ)句中,那么就危險(xiǎn)了。

7.2文章查看二ActiveRecord

7.2.1什么是ActiveRecord

Active Record (活動(dòng)記錄,以下簡(jiǎn)稱AR)提供了1個(gè)面向?qū)ο蟮慕涌?#xff0c; 用以訪問(wèn)數(shù)據(jù)庫(kù)中
的數(shù)據(jù)。
? 1個(gè) AR 類關(guān)聯(lián)1張數(shù)據(jù)表,每個(gè) AR 對(duì)象對(duì)應(yīng)表中的一行。
? AR對(duì)象的屬性,對(duì)應(yīng)為數(shù)據(jù)標(biāo)的列
? 可以直接以面向?qū)ο蟮姆绞絹?lái)操縱數(shù)據(jù)表中的數(shù)據(jù),這樣就不需要寫(xiě)SQL語(yǔ)句就能實(shí)現(xiàn)數(shù)

據(jù)庫(kù)的訪問(wèn)。

7.2.2聲明ActiveRecord 類

來(lái)看看post類,要聲明1個(gè) AR 類,最少,你需要從 yii\db\ActiveRecord 基類來(lái)繼承, 并
且要實(shí)現(xiàn) tableName 的方法,明確這個(gè)AR類的屬性是關(guān)聯(lián)哪張數(shù)據(jù)表。這樣就已經(jīng)聲明了1
個(gè)最基本的AR類。當(dāng)然,1個(gè)完整的AR類還應(yīng)該有屬性標(biāo)簽,數(shù)據(jù)規(guī)則,業(yè)務(wù)代碼這些內(nèi)
容。
我們來(lái)把post表簡(jiǎn)化一下,比如,只有4個(gè)字段,id是主關(guān)鍵字。 我們只需要實(shí)現(xiàn)Post類中

的tablename方法,就已經(jīng)建立好對(duì)應(yīng)post這個(gè)數(shù)據(jù)庫(kù)表的AR類,類名也是Post。

7.2.3如何查詢數(shù)據(jù)

兩種方法: AR 提供了兩個(gè)靜態(tài)方法來(lái)構(gòu)建 DB 查詢,并且把查詢到的數(shù)據(jù)填充到 AR 對(duì)象實(shí)例中,最 后返回這個(gè)對(duì)象。 這兩個(gè)方法,1個(gè)是find,1個(gè)是findBySql: yii\db\ActiveRecord::find() yii\db\ActiveRecord::findBySql()

7.2.4find方法

? ? ? ??第1點(diǎn),ActiveRecord方法有兩個(gè)快捷方法:findOne 和 findAll,可以來(lái)替換find方法。

? ? ? ??第2點(diǎn),可以看出,例子中的兩個(gè)查詢條件是比較簡(jiǎn)單的,我們實(shí)際開(kāi)發(fā)中很多時(shí)候會(huì)遇到

更為復(fù)雜的查詢條件。

? ? ? ??find方法是創(chuàng)建1個(gè)ActiveQueryInterface實(shí)例對(duì)象來(lái)實(shí)現(xiàn)查詢的。這個(gè)創(chuàng)建好的ActiveQueryInterface對(duì)象,需要進(jìn)1步調(diào)用ActiveQueryInterface中已經(jīng)定義好的方法來(lái)設(shè)置查詢條件,最后才通過(guò)調(diào)用one或all方法來(lái)得到AR對(duì)象。 ??

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

7.2.5findbysql() 查詢數(shù)據(jù)

? ? ? ??command對(duì)象來(lái)查詢非常類似,都是要寫(xiě)SQL,但是這個(gè)返回的是對(duì)象,而command返回的是數(shù)組。?

7.2.6ActiveRecord? ? ??

7.2.7ActiveRecord如何操作數(shù)據(jù)

? ? ?訪問(wèn)列數(shù)據(jù)

? ? ??find方法得到model對(duì)象后,使用model->id就可以讀出id這個(gè)列的值,這個(gè)的id和title就是數(shù)據(jù)表的列名。

注意,如果返回的是對(duì)象數(shù)組時(shí),我們應(yīng)該使用foreach來(lái)遍歷每個(gè)對(duì)象。

7.2.8操作數(shù)據(jù)

? ? ??AR 提供下面這些方法來(lái)實(shí)現(xiàn)插入、更新和刪除等功能:
? ? ? yii\db\ActiveRecord::save() ? ? ? ?yii\db\ActiveRecord::insert()

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

? ? ??save方法可以用來(lái)替代insert和update方法。

? ? ??ActiveRecord可以說(shuō)是Yii框架的靈魂,它把數(shù)據(jù)庫(kù)和模型建立了聯(lián)系,使用面向?qū)ο蟮姆绞絹?lái)操縱數(shù)據(jù)表中的數(shù)據(jù),一個(gè) AR 類關(guān)聯(lián)一張數(shù)據(jù)表,每個(gè) AR 對(duì)象對(duì)應(yīng)表中的一行。關(guān)于ActiveRecord的知識(shí)還不止這些,我們后面還會(huì)不斷補(bǔ)充。

7.3文章查看三拼接數(shù)據(jù)表

7.3.1數(shù)據(jù)小部件

? ? ? ??顧名思義,數(shù)據(jù)小部件用來(lái)顯示數(shù)據(jù)的小模塊。 常用的小部件有DetailView,ListView。
? ? ? ? DetailView:主要用來(lái)顯示1條記錄數(shù)據(jù)的詳細(xì)情況。

? ? ? ? ListView 和 GridView:他們可以用來(lái)顯示1個(gè)擁有分頁(yè)、 排序和過(guò)濾功能的1組數(shù)據(jù)。

?

7.3.2DetailView數(shù)據(jù)小部件

DetailView小部件通常用來(lái)顯示的是一條記錄的詳情。

?

  • 一個(gè)Model模型類對(duì)象。
  • ?一個(gè)AR類的實(shí)例對(duì)象。
  • 由鍵值對(duì)構(gòu)成的一個(gè)關(guān)聯(lián)數(shù)組
  • ?

    7.3.3關(guān)聯(lián)表查詢

    看看代碼,在Post文章類中,只要實(shí)現(xiàn)一個(gè)叫g(shù)etStatus0的方法,就可以建立起兩張表的關(guān)聯(lián)關(guān)系了,getStatus0方法的返回值是執(zhí)行文章對(duì)象本身的hasone方法的結(jié)果,hasone方法參數(shù)中第1項(xiàng)Poststatus::className()就是文章?tīng)顟B(tài)表的表名,第2項(xiàng)是關(guān)聯(lián)的條件,這是poststatus表里面id字段等于Post表中的status字段。

    這段代碼就是建立文章章類和文章?tīng)顟B(tài)類的關(guān)聯(lián)關(guān)系。

    代碼思路: 這樣的話,我們要拿到“已發(fā)布”這個(gè)?字,就可以了 $thePost->status0->name 這種形式來(lái)拿到了。 $model->status0相當(dāng)于1個(gè) poststatus文章?tīng)顟B(tài)的對(duì)象, 然后取它的name屬性值,就可以了。

    7.3.4多對(duì)一 一對(duì)多

    這里的hasOne方法,因?yàn)槲恼聦?duì)于文章?tīng)顟B(tài)來(lái)說(shuō),是多對(duì)一 一對(duì)一的關(guān)系。

    這里的hasMany方法,因?yàn)槲恼聦?duì)于文章評(píng)論來(lái)說(shuō),是一對(duì)多的關(guān)系。

    7.3.5圖表展示

    一個(gè)拼接的完整過(guò)程

    7.4文章查看四

    7.4.1日期格式的修改

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

    ? ? ?detailview的template屬性可以調(diào)節(jié)小部件中一行的模板,我們可以設(shè)置th標(biāo)簽的屬性來(lái)改變這一列的寬度。

    7.5修改頁(yè)面一:查詢數(shù)據(jù)

    7.5.1下拉菜單(AR的find方法,command對(duì)象方法, QueryBuilder)

    ActiveForm讓表單和模型結(jié)合起來(lái),充分利用了模型的數(shù)據(jù)規(guī)則,讓表單的驗(yàn)證代碼幾乎不
    用寫(xiě)。同時(shí),activefield簡(jiǎn)化了表單input元素的編寫(xiě),極大的減輕了表單開(kāi)發(fā)工作量,
    同時(shí)讓表單代碼的可讀性和可維護(hù)性提高。

    public $this dropDownList ( $items, $options = [] ) 下拉菜單dropdownlist就是其中一種,這是參考手冊(cè)的介紹,dropdownlist有2個(gè)參數(shù),第 1個(gè)items是1個(gè)鍵值對(duì)構(gòu)成的關(guān)聯(lián)數(shù)組,其中鍵對(duì)應(yīng)下拉菜單中的value,數(shù)組中的值對(duì)應(yīng) 下拉菜單中的選項(xiàng)。 另1個(gè)參數(shù)options是1個(gè)由鍵值對(duì)組成的關(guān)聯(lián)數(shù)組,這個(gè)表列出了這些鍵值對(duì)的用途。我們 會(huì)用到第1個(gè)prompt鍵,prompt鍵對(duì)應(yīng)的值是來(lái)設(shè)置下拉菜單的提示的字符串。 第一種方法: 第1種方法, 使用find方法取出對(duì)象數(shù)組,用ArrayHelper的map轉(zhuǎn)換為下拉菜單需要的格式就可以了。 $allStatus = Poststatus::find()->all(); 然后用ArrayHelper的靜態(tài)方法map把psOjbs這個(gè)對(duì)象數(shù)組進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換為鍵值對(duì)數(shù)組,也就是下拉菜單需要的鍵值對(duì)數(shù)組格式。 用allstatus來(lái)替換這些硬編碼。

    第二種方法:

    使用command對(duì)象來(lái)取數(shù)據(jù)。 $sts = Yii::$app->db->createCommand('SELECT id,name FROM poststatus')- >queryAll(); command對(duì)象執(zhí)行查詢后返回的是多維數(shù)組,同樣可以用arrayhelper的map靜態(tài)方法來(lái)轉(zhuǎn)換,這就得到鍵值對(duì)數(shù)組作參數(shù)。 刷新看到,也是我們需要的下拉菜單。

    第三種方法:

    querybuilder查詢構(gòu)建器是建在 DAO 基礎(chǔ)上,這樣創(chuàng)建的SQL語(yǔ)句,比原生SQL語(yǔ)句更易讀、更安全。

    7.5.2?數(shù)組助手類 Array Helper

    里面含有的方法:

    獲取值getValue ? ? ? ?獲取值

    獲取列g(shù)etColumn ? ?從多維數(shù)組或?qū)ο髷?shù)組中獲取某列的值

    ????????建立映射表map ? ? ? ?map方法可以從一個(gè)多維數(shù)組或1個(gè)對(duì)象數(shù)組中取出數(shù)據(jù),建1個(gè)新映射表

    command對(duì)象執(zhí)行查詢后返回的是多維數(shù)組,同樣可以用arrayhelper的map靜態(tài)方法來(lái)轉(zhuǎn)

    換,這里就得到鍵值對(duì)數(shù)組作參數(shù)。

    7.5.3QueryBuilder

    總得思路: 第1步是構(gòu)建查詢,首先創(chuàng)建1個(gè) yii\db\Query 對(duì)象來(lái)代表1條 SELECT SQL 語(yǔ)句, 然后通過(guò)調(diào)用一套可以串起來(lái)的方法,比如select方法,from方法,where方法等這些方法,構(gòu)建出可以滿足指定要求的查詢條件。 第2步是執(zhí)行查詢,執(zhí)行Query 構(gòu)建出來(lái)的查詢條件,可以執(zhí)行的查詢方法有很多,比如 有all方法取出所有數(shù)據(jù),one方法取第1條數(shù)據(jù),column方法取第1列數(shù)據(jù)等等

    7.5.4相關(guān)函數(shù)

    select方法是用來(lái)指定要取哪些字段,代表要取id和email2個(gè)字段的值,還可用addSelect方法來(lái)附加字段

    from來(lái)指定要從哪張表拿數(shù)據(jù)

    where方法用來(lái)設(shè)定查詢條件,寫(xiě)法也靈活,可以字符串形式,鍵值對(duì)數(shù)組形式,也可以是操作符形式

    orderby,可以用鍵值對(duì)數(shù)組的鍵來(lái)表示需要排序的字段,其值來(lái)設(shè)定升序或降序

    limit和offset的寫(xiě)法,比如:從第20條開(kāi)始取數(shù),取10條記錄

    indexBy:indexBy(id)來(lái)讓id這一列的值作為索引值,也就是數(shù)組的鍵。

    groupBy having:可以用addgroup添加分組字段,having用來(lái)設(shè)置分組過(guò)濾的條件,可以用andHaving() orHaving() 來(lái)添加條件。

    join用來(lái)做表的連接查詢,比如這條sql語(yǔ)句,可以寫(xiě)成這樣。在參數(shù)設(shè)定了連接類型,還有
    連接表,連接條件,如果需要的話,這里還有連接條件的參數(shù)綁定,這是為了預(yù)防sql注入的。
    union用來(lái)聯(lián)合2個(gè)不同的查詢。

    all()方法執(zhí)行后,可以得到多個(gè)多維數(shù)組,第1維是1個(gè)普通的索引數(shù)組,每1
    項(xiàng)對(duì)應(yīng)從數(shù)據(jù)表中查詢出來(lái)的一行。這些行就是第2維,是一個(gè)由字段名和值構(gòu)成的鍵值對(duì)

    數(shù)組。

    one()把a(bǔ)ll換成one() 方法看看,這里返回的是第1條記錄,這里就不是1個(gè)多維數(shù)組,只是1個(gè)

    鍵值對(duì)數(shù)組。

    column(),返回的是1個(gè)索引數(shù)組,由數(shù)據(jù)庫(kù)中的第1列數(shù)據(jù)組成。
    scalar(),返回第1行第1列的數(shù)據(jù),這是個(gè)字符串。

    count(),返回記錄條數(shù),是1個(gè)整數(shù)。

    7.5.5三種方法對(duì)比

    AR的find方法,本質(zhì)上也是用查詢構(gòu)建器來(lái)構(gòu)建查詢,返回的是對(duì)象.

    Command對(duì)象:返回?cái)?shù)組

    Query對(duì)象:可程序化構(gòu)建,DBMS無(wú)關(guān),易讀,更安全,他的返回值是多個(gè)多維數(shù)組。

    7.6修改頁(yè)面二

    7.6.1新建修改時(shí)間方法一

    方法一:當(dāng)文章改提交后,就會(huì)看到最后修改時(shí)間確實(shí)就是當(dāng)前時(shí)間,沒(méi)問(wèn)題。新
    增文章也一樣,實(shí)例化出文章對(duì)象model后,我們只要先把對(duì)象的createtime和updatetime

    兩個(gè)屬性,都賦值為當(dāng)前時(shí)間就可以了。

    7.6.2新建修改時(shí)間方法二

    AR的生命周期

    ?

    對(duì)新增時(shí)間和修改時(shí)間的設(shè)置,最合適的地方法就是beforeSave()這個(gè)方法,在提交的數(shù)據(jù)保存之前,把這個(gè)2個(gè)值設(shè)好,就實(shí)現(xiàn)了時(shí)間的自動(dòng)設(shè)置。

    來(lái)代碼中看看如何重寫(xiě)beforeSave方法: public function beforeSave($insert) $instert 是來(lái)區(qū)別對(duì)象的記錄寫(xiě)?數(shù)據(jù)庫(kù)時(shí),是新增還是修改。 if (parent::beforeSave($insert)) { 一定要先調(diào)用父類的beforeSave方法,保證這個(gè)方法原有的代碼先被執(zhí)行,然后再執(zhí)行 我們寫(xiě)的代碼。 $this->create_time=time();$this->update_time=time(); 新增的時(shí)候,2個(gè)時(shí)間都賦值,這2句只會(huì)在新增時(shí)被執(zhí)行一次。 else $this->update_time=time(); 以后發(fā)生修改,只會(huì)改變最后修改時(shí)間。 這樣就完成了修改。

    7.6.3AR的其他方法

    7.7頁(yè)面修改三

    7.7.1tags的修改的需求

    需求:

    當(dāng)這篇文章新增到數(shù)據(jù)庫(kù)以后,這張表的數(shù)據(jù)就會(huì)發(fā)生變化,先看看表中有沒(méi)有yii2這個(gè)標(biāo)簽,
    有的話就加1,再看看第2個(gè)標(biāo)簽“小部件”,也有,就加1. 再看看第三個(gè)widget,發(fā)現(xiàn)表中沒(méi)

    有這個(gè)標(biāo)簽,那么就新增一條記錄。

    7.7.2tags修改思路

    7.7.3updateFrequency的調(diào)用

    7.8管理頁(yè)面完善一

    7.8.1管理頁(yè)面需求

    PostSearch搜索類DataProvider數(shù)據(jù)提供者GridView數(shù)據(jù)小部件

    7.8.2GridView數(shù)據(jù)小部件

    ???要?jiǎng)?chuàng)建一個(gè)GridView,也是通過(guò)一個(gè)鍵值對(duì)數(shù)組來(lái)進(jìn)行配置的,鍵值對(duì)包括:

    ????? dataProvider 鍵指定提供數(shù)據(jù)的數(shù)據(jù)提供者。
    ????? filterModel 鍵指定一個(gè)能夠提供搜索過(guò)濾功能的搜索模型類。
    ????? columns 鍵來(lái)指定需要展示的列,以及展示的格式

    7.8.3GridView之columns

    ????? 序號(hào)列類: 用來(lái)產(chǎn)生行號(hào)的,從 1 起始并自動(dòng)增加;
    ????? 數(shù)據(jù)列: 用于顯示數(shù)據(jù)
    ????? 動(dòng)作列: 顯示動(dòng)作按鈕,如查看、更新、刪除操作,我們講到評(píng)論管理的時(shí)候,會(huì)增加一個(gè)審核的按鈕,到時(shí)會(huì)詳細(xì)介紹動(dòng)作列這個(gè)類。

    ????? 復(fù)選框列: 用來(lái)顯示一個(gè)復(fù)選框列

    7.8.3.1columns之?dāng)?shù)據(jù)列

    這里列出了幾個(gè)經(jīng)常改動(dòng)的鍵, attribute 指定需要展示的屬性 label 標(biāo)簽名 value 值 format 格式 filter 自定義過(guò)濾條件的輸入框 contentOptions 設(shè)定數(shù)據(jù)列的HTML屬性

    7.8.4ActiveDataProvider

    ? 可以獲取數(shù)據(jù),并提供給其他組件或頁(yè)面使用
    ? 可將獲取到的數(shù)據(jù)進(jìn)行分頁(yè)和排序
    ? 經(jīng)常用來(lái)給數(shù)據(jù)小物件提供數(shù)據(jù),方便用戶互動(dòng)地進(jìn)行數(shù)據(jù)的分頁(yè)與排序

    ? 實(shí)現(xiàn)了 yii\data\DataProviderInterface 接口類

    DataProvider根據(jù)獲取數(shù)據(jù)的方式不同,有這3種類型: ActiveDataProvider是通過(guò)查詢構(gòu)建器的方式從數(shù)據(jù)庫(kù)取數(shù)據(jù)。 SqlDataProvider通過(guò)sql語(yǔ)句從數(shù)據(jù)庫(kù)拿數(shù)據(jù) ArrayDataProvider由數(shù)組提供數(shù)據(jù)。

    7.8.4.1接口類方法-排序與分頁(yè)

    getPagination,是讀出分頁(yè)對(duì)象信息的,可以看到,我們?cè)O(shè)置的pagesize=6. getSort,這些是顯示哪些屬性可以用來(lái)排序,以及支持用哪些順序來(lái)排。 defaultorder是顯示默認(rèn)的排序字段和排序方式 getCount 是當(dāng)前頁(yè)的數(shù)據(jù)條數(shù)。 getTotalCount 則是所有記錄的條數(shù)。 分別是6和11,都沒(méi)問(wèn)題。 我們主要通過(guò)配置pagination和sort來(lái)設(shè)定數(shù)據(jù)提供者的分頁(yè)和排序的設(shè)定。 還要補(bǔ)充一個(gè)車(chē)常用方法getmodels,這個(gè)方法就是把數(shù)據(jù)提供者中的數(shù)據(jù)取出來(lái)。

    7.9管理頁(yè)面的完善二-PostSearch

    此處的主要作用就是用來(lái)根據(jù)輸入的作者的姓名進(jìn)行搜索與排序

    7.9.1gridview

    gridview會(huì)根據(jù)PostSearch和Post的屬性名,把表單的輸入項(xiàng)和數(shù)據(jù)的展示項(xiàng)一一對(duì)

    應(yīng)起來(lái)。比如:id這一列數(shù)據(jù),對(duì)應(yīng)的表單就是PostSearch類中的id屬性。
    如果我們把搜索類換成comment,gridview就會(huì)看看comment有哪些屬性,
    然后和下面的數(shù)據(jù)展示列對(duì)應(yīng),發(fā)現(xiàn)除了status,其他都對(duì)不上,所以只能能把status展示出
    來(lái)。?

    7.9.2根據(jù)屬性查詢

    既然要用作者姓名來(lái)查詢,用authorid只能按id查,那我們能

    不能給PostSearch類額外增加一個(gè)屬性authorName,然后用這個(gè)屬性來(lái)實(shí)現(xiàn)按字符串查詢

    姓名。

    之后還要在postsearch里面進(jìn)行添加authname的屬性與驗(yàn)證規(guī)則rules

    7.9.3PostSearch類的Rules

    現(xiàn)在給我們?cè)黾拥膶傩詀uthorName,加上1個(gè)驗(yàn)證規(guī)則,可以認(rèn)為提交的數(shù)據(jù)是安全的。

    7.9.4重點(diǎn)搜索

    第1句,構(gòu)建了1個(gè)查詢。

    第2句,數(shù)據(jù)提供者dataprovider把數(shù)據(jù)、分頁(yè)、排序都封裝了好。

    第3句,作為結(jié)果返回dataprovider。

    load進(jìn)行塊賦值(是使用的輸入的數(shù)據(jù))

    7.9.5屬性name進(jìn)行搜索

    1.賦值:使用load進(jìn)行輸入name屬性

    2.使用join命令連接關(guān)聯(lián)表adminuse與post文章表格進(jìn)行連接

    3.進(jìn)行l(wèi)ike比對(duì)使用andfilterwhere命令

    7.9.6對(duì)于dataprovider進(jìn)行排序

    添加排序的小插件即可

    7.9.7總結(jié)

    8.后臺(tái)完善評(píng)論管理

    8.1評(píng)論管理頁(yè)面的完善

    需求 3. 評(píng)論內(nèi)容的長(zhǎng)短不一,看起來(lái)不方便,考慮截取評(píng)論前面一小段來(lái)展示。 9. 把待審核的評(píng)論排在排前面,并用不同底色區(qū)別。 10.添加一個(gè)審核按鈕,可以對(duì)評(píng)論進(jìn)行審核。 11.顯示待審核評(píng)論條數(shù)的氣泡。

    8.2匿名函數(shù)$Value

    函數(shù)簡(jiǎn)介

    關(guān)于這段,用匿名函數(shù)來(lái)設(shè)置value的寫(xiě)法,我們可以查看參考手冊(cè): -value可以用匿名函數(shù)或字符串來(lái)設(shè)置, -匿名函數(shù)用這樣的格式,我們用到的model,指的是當(dāng)前行的數(shù)據(jù)對(duì)象,key 是當(dāng)前行的 鍵,index是當(dāng)前行的索引值,column是數(shù)據(jù)列對(duì)象。 例子中,我們只用到model,在渲染每一行的時(shí)候,我們會(huì)把當(dāng)前的對(duì)象的content值取出來(lái), 進(jìn)行截取處理,然后再作為結(jié)果提供給gridview渲染頁(yè)面。

    8.3模型類的getter和setter方法

    使用方法

    先看看語(yǔ)法格式: getter方法的方法名以 get 開(kāi)頭,get后面的部分就是屬性的名字。 setter方法名以 set 開(kāi)頭。 get后面的部分就是屬性的名字。 定義好方法后,就可以像普通屬性一樣使用。但是本質(zhì)有區(qū)別:當(dāng)這種屬性被讀取時(shí),對(duì)應(yīng) 的 getter方法將被調(diào)用;而當(dāng)屬性被賦值時(shí),對(duì)應(yīng)的 setter 方法就調(diào)用。 如果只定義了 getter 方法,但沒(méi)有定義setter方法,那么屬性是只讀屬性,只能讀不能 寫(xiě),對(duì)它賦值會(huì)拋出異常。多數(shù)情況下,我們都是定義只有g(shù)etter方法的只讀屬性,這種屬性一般不會(huì)持久化保存, 多數(shù)是一個(gè)業(yè)務(wù)邏輯需要的計(jì)算結(jié)果。

    8.4bootstrap

    8.4.1全局css樣式

    要重點(diǎn)理解柵格系統(tǒng),它把頁(yè)面分成12個(gè)單元,你可以通過(guò)設(shè)置單元格數(shù),來(lái)把頁(yè)面進(jìn)行分 欄: 比如這里,左邊占8個(gè)單元,右邊占4個(gè)。對(duì)應(yīng)代碼就這樣寫(xiě)。 也可以分3欄,每欄4個(gè)單元。這是對(duì)應(yīng)的代碼 博客的前臺(tái)頁(yè)面就分成了2個(gè)欄,左邊是9,右邊是3。

    8.4.2組件

    先看字體圖標(biāo),有許多很漂亮很常見(jiàn)的圖標(biāo),這就是我們選用的審核按鈕,這是class屬性, 使用很簡(jiǎn)單,我們只需要把這段代碼的class屬性改成我們需要的圖標(biāo)屬性就可以了。 還有標(biāo)簽,通過(guò)<h+數(shù)字>這種形式可以控制標(biāo)簽的大小,用label+一個(gè)代表場(chǎng)景的英文單 詞,就可以設(shè)置不同的顏色。我們的標(biāo)簽云就是用到這2個(gè)屬性來(lái)控制顏色和大小的。 徽章,我們會(huì)?它來(lái)做待審核評(píng)論條數(shù)的氣泡。使用也非常簡(jiǎn)單。

    8.4.3JavaScript 插件

    JavaScript 插件使用起來(lái)很簡(jiǎn)單,不需要去編寫(xiě)調(diào)試大量的js代碼,就可以給網(wǎng)頁(yè)帶來(lái)很酷 的用戶體驗(yàn)。

    8.5評(píng)論審核功能的修改完善

    8.5.1需求

    先來(lái)看看,如何把待審核的評(píng)論排在排前面,并用不同底色區(qū)別。

    8.5.2思路

    1.排序我們先設(shè)定好排序,狀態(tài)按正序排列,待審核的排前面,相同狀態(tài)的再按id來(lái)倒序排,新發(fā)
    表的評(píng)論排前面。可以看到,待審核狀態(tài)的排到了前面,相同狀態(tài)里面,進(jìn)一步是按id倒序
    排的。
    2.通過(guò)contentOptions來(lái)給狀態(tài)列的css樣式進(jìn)行設(shè)置,設(shè)置待審核的數(shù)據(jù)格有不同的
    底色進(jìn)行區(qū)分。
    這時(shí)候,要用到匿名函數(shù),在函數(shù)中判斷當(dāng)前對(duì)象的狀態(tài)是否為“待審核”,如果是的話,
    我們就給數(shù)據(jù)單元格分配一個(gè)bg-danger類的樣式。

    8.5.3代碼

    ?

    添加審核按鈕

    排序

    待審核變色顯示

    第1步,先添加1個(gè)審核按鈕。 在gridview中,是actionColumn這個(gè)類來(lái)負(fù)責(zé)展示動(dòng)作按鈕。現(xiàn)在這個(gè)寫(xiě)法,也是1種簡(jiǎn)寫(xiě), 是最簡(jiǎn)單的配置情況,只展示查看、修改和刪除按鈕。 下面,我們來(lái)看看如何對(duì)這個(gè)類進(jìn)行定義, template 用template 來(lái)定義動(dòng)作列中有哪些按鈕,大括號(hào)內(nèi)括起來(lái)的就是按鈕,按鈕的功能靠控制器 中的動(dòng)作來(lái)實(shí)現(xiàn),按鈕的命名要對(duì)應(yīng)控制器中動(dòng)作的 actionID。 比如view這個(gè)按鈕,對(duì)應(yīng)的就是控制器中文章查看的動(dòng)作:activeView 默認(rèn)情況時(shí),只有前面3個(gè)按鈕。我們現(xiàn)在要增加1個(gè)審核按鈕,那么就在原先的基礎(chǔ)上添 加1個(gè)新的按鈕approve。 buttons 添加以后,還需要buttons來(lái)進(jìn)1步設(shè)置這個(gè)按鈕: 用按鈕名來(lái)作為鍵名,值為按鈕的渲染回調(diào)函數(shù),這里只需要對(duì)approve來(lái)進(jìn)行設(shè)定,其他 的查看,修改和刪除按鈕已經(jīng)默認(rèn)設(shè)置好的,如果感興趣,可以去追蹤源碼看看: 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); }; } 這就是對(duì)評(píng)論查看按鈕的設(shè)置,這還用到了yii的t方法,用來(lái)翻譯成其他語(yǔ)言,比如這是 view,因?yàn)槲覀冊(cè)O(shè)定的語(yǔ)言是中文,所有你看到的提示是查看。 好了,回來(lái)繼續(xù)approve,這是回調(diào)函數(shù)參數(shù)的說(shuō)明,title和label不?翻譯,直接寫(xiě)中文, data-confirm可以在點(diǎn)擊這個(gè)按鈕時(shí)彈出個(gè)提示框,最后,返回的html代碼用到了bootstrap 中的圖標(biāo)check。這樣就寫(xiě)好按鈕的回調(diào)函數(shù)。 此外,還要補(bǔ)充1個(gè)不是很常見(jiàn)的屬性controller,如果按鈕對(duì)應(yīng)的動(dòng)作是在別的控制器中, 那么就通過(guò)controller來(lái)指定那個(gè)控制器,否則默認(rèn)就是當(dāng)前的控制器。 好的,我們到代碼里面來(lái)實(shí)現(xiàn)審核按鈕,保存刷新后,圖標(biāo)出來(lái)了,點(diǎn)來(lái)看看,404沒(méi)有網(wǎng)頁(yè) ,因?yàn)槲覀冞€沒(méi)有在控制器中寫(xiě)對(duì)應(yīng)的動(dòng)作方法。 第2步,到控制器中來(lái)寫(xiě)1個(gè)approve的動(dòng)作,我們知道控制器的代碼總是很簡(jiǎn)單的,有什 么具體任務(wù)讓模型做,做完后看看哪個(gè)視圖來(lái)渲染。 先把需要審核的對(duì)象找出來(lái),然后讓模型去按業(yè)務(wù)需求完成審核工作,這里能不需要特別的 審核頁(yè)面,審核頁(yè)面是改變一下?tīng)顟B(tài),所以頁(yè)面還是回到評(píng)論管理,也就是index這個(gè)頁(yè)面就 可以了。 第三步,是去模型?件去實(shí)現(xiàn)審核這個(gè)業(yè)務(wù)需求,這個(gè)需求?常簡(jiǎn)單,就是把評(píng)論的狀態(tài)從1 改為2,2代表已審核,返回1個(gè)布爾值,保存成功就返回true,這樣就可以了。 看看效果,點(diǎn)審核時(shí)會(huì)有個(gè)提示,確定后就會(huì)去執(zhí)?審核的代碼,執(zhí)?完后,還是回來(lái)這個(gè) 頁(yè)面。這時(shí)候剛才那條就已經(jīng)審核通過(guò)了。



    控制器

    模型

    8.5.4導(dǎo)航欄加個(gè)氣泡

    用來(lái)顯示待審核的評(píng)論條數(shù)

    8.5.4.1控制器

    8.5.4.2視圖

    ?使用bootstrap進(jìn)行加載氣泡的css樣式

    第九部分 后臺(tái)完善用戶管理

    9.1用戶管理需求

    1. 認(rèn)證 2. 前后臺(tái)認(rèn)證的分離 3. 用戶管理頁(yè)面的完善 4. 授權(quán)

    9.2簡(jiǎn)述

    認(rèn)證是鑒定用戶身份的過(guò)程。通常是使用用戶名和密碼來(lái)鑒別用戶身份。認(rèn)證是登錄功能的基礎(chǔ)。

    Yii框架是用用戶組件 yii\web\User 來(lái)管理用戶的認(rèn)證狀態(tài)。分2個(gè)步驟來(lái)實(shí)現(xiàn)認(rèn)證
    1. 先給用戶組件 yii\web\User 指定1個(gè)含有實(shí)際認(rèn)證邏輯的認(rèn)證類。比如:app\models\User

    2. 讓認(rèn)證類user類實(shí)現(xiàn) yii\web\IdentityInterface (相當(dāng)于驗(yàn)證方法)這個(gè)接口,接口包括這幾個(gè)方法。

    9.3思路與步驟

    9.3.1控制器

    ? 登錄頁(yè)面,在sitecontroller的actionlogin方法里面。 第一步 第1句判斷,先看看你是不是沒(méi)有進(jìn)入系統(tǒng)的游客,如果是已經(jīng)登錄進(jìn)去的賬戶,那就不要 來(lái)登錄口這里玩,讓他去到首頁(yè)那里玩,isGuest這部分稍后還會(huì)進(jìn)1步介紹。以下為代碼展示 第二部 接下來(lái)新建1個(gè)loginform對(duì)象,loginform是1個(gè)模型類,對(duì)應(yīng)的是登錄表單,也有1般模 型類都有的屬性,驗(yàn)證規(guī)則,還有業(yè)務(wù)邏輯。 第三步 回來(lái)控制器,這里是塊賦值,通過(guò)LoginForm對(duì)象拿到用戶提交的數(shù)據(jù),然后調(diào)用表單模型的login方法。 login方法如果執(zhí)成功,就代表驗(yàn)證就通過(guò),調(diào)用goBack返回到登錄前的頁(yè)面就可以了。否則依然停在登錄頁(yè)面,讓你繼續(xù)提交用戶名和密碼。 我們看到,是否能驗(yàn)證通過(guò),關(guān)鍵點(diǎn)在表單類model的login方法這里,這里執(zhí)行成功,驗(yàn)證就通過(guò)了。

    9.3.2LoginForm

    表單類的login方法,主要有2個(gè)步驟: 1.第1步,模型類的validate方法,是看看表單提交的數(shù)據(jù)是否符合這些數(shù)據(jù)規(guī)則。 2.第2步,如果符合規(guī)則,接下就會(huì)執(zhí)行Yii::$app->user->login()這句,這1句表示驗(yàn)證已 經(jīng)成功,注冊(cè)進(jìn)入系統(tǒng),這1句稍后會(huì)再解釋。

    ?

    9.4前后臺(tái)認(rèn)證分離

    ?

    9.4.1分離步驟

    9.4.2代碼操作

    修改對(duì)應(yīng)adminuser的模型

    9.4.3共用session連接

    ?

    內(nèi)容選擇魏曦教你學(xué)

    總結(jié)

    以上是生活随笔為你收集整理的Yii框架与项目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。