1. 程式人生 > >yii2 basic版 MVC 部分

yii2 basic版 MVC 部分

數據庫 var_dump 只需要 asi esp tro ria end ams

一、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 部分