yii2 basic版 MVC 部分
一、model
1、什么是模型
- 模型是 MVC 模式中的一部分,是表現(xiàn)業(yè)務(wù)數(shù)據(jù)、規(guī)則和邏輯的對象
- 可通過繼承 yii\base\Model 或它的子類(activeRecord)來定義模型類,基類 yii\base\Model 支持許多實用的特性
- Model 類也是更多高級模型例如 Active Record 活動記錄的基類。
2、yii\base\Model 支持以下實用特性:
屬性 : 表現(xiàn)業(yè)務(wù)數(shù)據(jù),可以像普通類屬性或數(shù)組一樣被訪問 (e.g. public $name)
屬性標簽 :指定屬性顯示出來的標簽 (例如: models\ContactForm 類,function attributeLabels(){} 方法里面定義的就是屬性標簽)
3、塊兒賦值 :支持一步給許多屬性賦值;
$model->load(Yii::$app->request->post()) # 使用load()方法進行塊兒賦值,$app->request->post()獲取所有由前臺提交過來的數(shù)據(jù)4、驗證規(guī)則 :確保數(shù)據(jù)數(shù)據(jù)符合所申明的驗證規(guī)則(例如在 models\ContactForm 類,function rules(){} 方法里面定義)
public function rules() {return [[['name', 'email', 'subject', 'body'], 'required'], // name, email, subject 和 body are 都是必填字段['name','integer'], // name 必須是整數(shù)['name','compare','compareValue'=>30,'operator'=>'>='], // name >=30['email', 'email'], // email 必須是一個合法的郵箱地址['verifyCode', 'captcha'], // 驗證碼必須填寫正確]; } 驗證時采用 yii\base\Model::validate() 方法觸發(fā)數(shù)據(jù)驗證,如果有數(shù)據(jù)驗證失敗,將自動把 yii\base\Model::hasErrors() 屬性置為 true,
可以使用 yii\base\Model::getErrors() 來查看錯誤詳情。e.g:
- yii\base\Model 用于普通模型類的父類并與數(shù)據(jù)表無關(guān)
- yii\base\activeRecord 用于普通模型類的父類并與數(shù)據(jù)表有關(guān)
- yii\base\activeRecord 也是繼承 yii\base\Model ,但是增加了數(shù)據(jù)庫處理
5、表與表之間的關(guān)聯(lián)(多對一或者一對一,例如文章對應(yīng)文章狀態(tài),使用 hasOne() )
? (一對多,例如文章對應(yīng)文章評論,使用 hasMany() ?)
/*** Post 類多了一個 commets 屬性,這個屬性是一個數(shù)組,數(shù)組是由評論對象組成的* 獲取評論使用:$Post -> comments 來獲取,但它是一個對象數(shù)組,如果要訪問具體的某個對象,就需要用 foreach 來遍歷*/public function getComments(){return $this->hasMany(Comment::className(), ['post_id' => 'id']);}二、view
1、布局文件
- 布局是一種特殊的視圖,代表多個視圖的公共部分,默認使用 views/layouts/main.php
2、如何創(chuàng)建布局
- 布局也是視圖,它可以像普通視圖一樣創(chuàng)建
- 布局默認存儲在 @app\view\layouts 下面
3、如何變幻布局
- 默認會使用 @app\view\layouts\main.php布局文件
- 更換整個類中的布局 : public $layout = 'dcr';
- 更換某一個頁面的布局 : 在方法中添加 $this -> layout = 'dcr';
- 如果一個頁面不需要任何布局,只需要在方法中設(shè)置 $this->layout=false;
4、布局文件的數(shù)據(jù)
- 兩個預(yù)定義變量 $this 和 $content
- 和視圖中的 $this 一樣,$this 指向 yii\web\View 的實例
- $content 就是控制器渲染出來的結(jié)果,每一頁的結(jié)果都不同。
5、布局文件的結(jié)構(gòu)
<?php $this->beginPage() ?> // 在布局的開始處調(diào)用 $this 指向 yii\web\view 來管理和渲染這個視圖文件,用來標識一個html文件的開始 <html><head><?php $this->header() ?> // 在 head 標簽處調(diào)用,標識html文件頭部的位置</head><body><?php $this->beginBody() ?> // 在 body 的開始處調(diào)用,標識 html 文件 body 部分的起始位置<?php $this->endBody() ?> // 在 body 的起始處調(diào)用,標識 html 文件 body 部分的結(jié)束位置</body> </html> <?php $this->endPage() ?> // 在布局的結(jié)尾處調(diào)用,用來標識一個html文件的結(jié)束?
6、使用 <?=Html::encode($variable) ?> 可以防止被惡意JavaScript xss(跨站腳本)攻擊,就是使用htmlspecialchars()將預(yù)定義字符轉(zhuǎn)換為 html 實體
htmlspecialchars($content, ENT_QUOTES | ENT_SUBSTITUTE,'UTF-8', true);
- ENT_QUOTES - 編碼雙引號和單引號
- ENT_SUBSTITUTE - 把無效的編碼替代成一個指定的帶有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一個空的字符串。
7、render 在 view 中的應(yīng)用:
<?= $this->render('_form', [ 'model' => $model, ]) ?>- _form 是同目錄下的一個文件,專門用來展示表單
- model 是從數(shù)據(jù)庫查詢的對象數(shù)組
三、controller
1、控制器
- ?MVC 結(jié)構(gòu)中的 c 部分
- ?從 yii\base\Controller 繼承而來
- 具體來說,是從模型對象中拿到需要的數(shù)據(jù),然后調(diào)用視圖模板文件來渲染這些數(shù)據(jù),然后生成輸出響應(yīng)信息
?2、組成
- 控制器主要有動作組成
- 動作是控制器類中的方法
- 一個動作對應(yīng)一個頁面
3、render()
查看方法:從類參考手冊中的yii\web\controller\所有方法中查看render()方法
public string render($view,$params=[])
- $view 指視圖名
- $params 是傳給視圖的數(shù)據(jù)
- 返回的是字符串,就是渲染好的結(jié)果
- 還有視圖或文件不存的時候拋出的異常
4、控制器中的方法
- ?Yii 使用 action 前綴區(qū)分普通方法和操作。action 后面的操作被映射為操作的 ID
- ?若方法名有多個單詞組成,那么 視圖名由連字符連接,例如:
?
5、yii\web\Request::post() 方法負責收集用戶提交的數(shù)據(jù)
public function actionEntry(){$model = new EntryForm;if($model->load(Yii::$app->request->post())&&$model->validate()){return $this->render('entry-confirm',['model'=>$model]);}else{return $this->render('entry',['model'=>$model]);} }- Yii::$app 代表應(yīng)用實例,是一個可全局訪問的單例,能提供 request、response、db 等特定功能的組件
?注:本文為作者(44106-kangaroo) 看完魏羲教你學Yii2.0 視頻后所記,如有轉(zhuǎn)載請注明出處:http://www.cnblogs.com/chrdai/p/8004737.html
轉(zhuǎn)載于:https://www.cnblogs.com/chrdai/p/8004737.html
總結(jié)
以上是生活随笔為你收集整理的yii2 basic版 MVC 部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mint ui datetimepick
- 下一篇: s3c2440移植MQTT