Yii框架(二)Model處理數據


熟悉php的autoload機制,自己實現一個autoload函數

 

一.復習框架:

basic/                  應用根目錄
    composer.json       Composer 配置文件, 描述包信息
    config/             包含應用配置及其它配置
        console.php     控制台應用配置信息
        web.php         Web 應用配置信息
    commands/           包含控制台命令類
    controllers/        包含控制器類
    models/             包含模型類
    runtime/            包含 Yii 在運行時生成的文件,例如日志和緩存文件
    vendor/             包含已經安裝的 Composer 包,包括 Yii 框架自身
    views/              包含視圖文件
    web/                Web 應用根目錄,包含 Web 入口文件
        assets/         包含 Yii 發布的資源文件(javascript 和 css)
        index.php       應用入口文件
    yii                 Yii 控制台命令執行腳本

  

 

使用表單

本章節介紹如何創建一個讓用戶提交數據的表單頁

該頁顯示一個包含 name 輸入框和 email 輸入框的表單。

當提交這兩部分信息后,頁面將會顯示用戶所輸入的信息。

為了實現這個目標,除了創建一個操作和兩個視圖還需要創建一個模型

貫穿整個小節,你將會學到:

  • 創建一個模型代表用戶通過表單輸入的數據
  • 聲明規則去驗證輸入的數據
  • 視圖中生成一個 HTML 表單

 

創建模型 

EntryForm 類包含 name 和 email 兩個公共成員, 用來儲存用戶輸入的數據。
它還包含一個名為 rules() 的方法, 用來返回數據驗證規則的集合。

 

模型類 EntryForm 代表從用戶那請求的數據, 該類如下所示並存儲在 models/EntryForm.php 文件中。 請參考類自動加載章節獲取更多關於類命名約定的介紹

<?php

namespace app\models;

use Yii;
use yii\base\Model;

class EntryForm extends Model
{
    public $name;
    public $email;
//EntryForm 類包含 name 和 email 兩個公共成員, 用來儲存用戶輸入的數據
//它還包含一個名為 rules() 的方法, 用來返回數據驗證規則的集合。 public function rules()
{ return [ [['name', 'email'], 'required'], ['email', 'email'], ]; } }

該類繼承自Yii 提供的一個基類 yii\base\Model, 該基類Model通常用來表示數據。

  補充:yii\base\Model 被用於普通模型類的父類並與數據表無關

  yii\db\ActiveRecord 通常是普通模型類的父類但與數據表有關聯(譯注:yii\db\ActiveRecord 類其實也是繼承自 yii\base\Model,增加了數據庫處理)。

EntryForm 類包含 name 和 email 兩個公共成員, 用來儲存用戶輸入的數據。它還包含一個名為 rules() 的方法, 用來返回數據驗證規則的集合。上面聲明的驗證規則表示:

  • name 和 email 值都是必須的
  • email 的值必須滿足email規則驗證.

如果你有一個處理用戶提交數據的 EntryForm 對象, 你可以調用它的 yii\base\Model::validate() 方法觸發數據驗證。如果有數據驗證失敗, 將把 yii\base\Model::hasErrors 屬性設為 ture, 想要知道具體發生什么錯誤就調用 yii\base\Model::getErrors。

<?php
$model = new EntryForm();
$model->name = 'Qiang';
$model->email = 'bad';
if ($model->validate()) {
    // 驗證成功!
} else {
    // 失敗!
    // 使用 $model->getErrors() 獲取錯誤詳情
}

 

創建操作 

下面你得在 site 控制器SiteController中創建一個 entry 操作用於新建的模型。

操作的創建和使用已經在上一篇中解釋了。 

首先創造了一EntriyForm對象:model  然后通過post函數從html表單中$_POST獲取數據,然后驗證數據validate;

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\EntryForm;

class SiteController extends Controller
{
    // ...其它代碼...

    public function actionEntry()
    {
        $model = new EntryForm;

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // 驗證 $model 收到的數據

            // 做些有意義的事 ...

            return $this->render('entry-confirm', ['model' => $model]);//給視圖entry-confirm去核查數據
 } else { // 無論是初始化顯示還是數據驗證錯誤 return $this->render('entry', ['model' => $model]); } } }

  

該操作首先創建了一個 EntryForm 對象。然后嘗試從 $_POST 搜集用戶提交的數據, 由 Yii 的 yii\web\Request::post() 方法負責搜集。

如果模型被成功填充數據(也就是說用戶已經提交了 HTML 表單), 操作將調用 yii\base\Model::validate() 去確保用戶提交的是有效數據。 

 

補充:表達式 Yii::$app 代表應用實例, 它是一個全局可訪問的單例

同時它也是一個服務定位器, 能提供 requestresponsedb 等等特定功能的組件。 在上面的代碼里就是使用 request 組件來訪問應用實例收到的 $_POST 數據。

用戶提交表單后,操作將會渲染一個名為 entry-confirm 的視圖去確認用戶輸入的數據

。 如果沒填表單就提交,或數據包含錯誤(譯者:如 email 格式不對),entry 視圖將會渲染輸出, 連同表單一起輸出的還有驗證錯誤的詳細信息。

注意:在這個簡單例子里我們只是呈現了有效數據的確認頁面。 實踐中你應該考慮使用 yii\web\Controller::refresh() 或 yii\web\Controller::redirect() 去避免表單重復提交問題

創建視圖 

最后創建兩個視圖文件 entry-confirm 和 entry。 他們會被剛才創建的 entry 操作渲染。

entry-confirm 視圖簡單地顯示提交的 name 和 email 數據。

視圖文件保存在 views/site/entry-confirm.php

<?php
use yii\helpers\Html;
?>
<p>You have entered the following information:</p>

<ul>
    <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
    <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
</ul> 

entry 視圖顯示一個 HTML 表單。視圖文件保存在 views/site/entry.php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name') ?>

    <?= $form->field($model, 'email') ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

  

視圖使用了一個功能強大的小部件 yii\widgets\ActiveForm 去生成 HTML 表單。

其中的 begin() 和 end() 分別用來渲染表單的開始和關閉標簽。

在這兩個方法之間使用了 yii\widgets\ActiveForm::field() 方法去創建輸入框。

第一個輸入框用於 “name”,第二個輸入框用於 “email”。

之后使用 yii\helpers\Html::submitButton() 方法生成提交按鈕。

嘗試下 

用瀏覽器訪問下面的 URL 看它能否工作:

http://hostname/index.php?r=site/entry


下面兩個圖片就是view的兩個php
views/site/entry.php

 views/site/entry-confirm.php

 
 

 

 

效果說明 

你可能會好奇 HTML 表單暗地里是如何工作的呢,看起來它可以為每個輸入框顯示文字標簽, 而當你沒輸入正確的信息時又不需要刷新頁面就能給出錯誤提示, 似乎有些神奇。

是的,其實數據首先由客戶端 JavaScript 腳本驗證,然后才會提交給服務器通過 PHP 驗證。 yii\widgets\ActiveForm 足夠智能到把你在 EntryForm 模型中聲明的驗證規則轉化成客戶端 JavaScript 腳本去執行驗證。 如果用戶瀏覽器禁用了 JavaScript, 服務器端仍然會像 actionEntry() 方法里這樣驗證一遍數據。 這保證了任何情況下用戶提交的數據都是有效的。

警告:客戶端驗證是提高用戶體驗的手段。無論它是否正常啟用, 服務端驗證則都是必須的,請不要忽略它。

輸入框的文字標簽是 field() 方法生成的,內容就是模型中該數據的屬性名。 例如模型中的 name 屬性生成的標簽就是 Name

你可以按如下方式 在視圖中自定義標簽:

<?= $form->field($model, 'name')->label('自定義 Name') ?> <?= $form->field($model, 'email')->label('自定義 Email') ?>



補充:Yii 提供了相當多類似的小部件去幫你生成復雜且動態的視圖。 在后面你還會了解到自己寫小部件是多么簡單。 你可能會把自己的很多視圖代碼轉化成小部件以提高重用,加快開發效率。

總結 

接觸了 MVC 設計模式的每個部分。 學到了如何創建一個模型代表用戶數據並驗證它的有效性。

還學到了如何從用戶那獲取數據並在瀏覽器上回顯給用戶。 這本來是開發應用的過程中比較耗時的任務, 好在 Yii 提供了強大的小部件讓它變得如此簡單。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM