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