1. 程式人生 > 實用技巧 >yii 學習筆記 基本操作

yii 學習筆記 基本操作

前置知識

php yii是一個php框架,要確保熟悉類與物件及名稱空間

安裝

通過歸檔檔案安裝

從 yiiframework.com 下載歸檔檔案
將下載的檔案解壓縮到 Web 訪問的資料夾中
將 basic/web 設定為文件根目錄(document root)

執行

應用結構


每個應用都有一個入口指令碼web/index.php,這是整個應用中唯一可以訪問的php指令碼,入口指令碼接受一個web請求並建立應用例項去處理它
應用在它的元件輔助下解析請求,並分派請求至mvc元素
檢視使用小部件去建立複雜和動態的使用者介面

請求生命週期

1.使用者向入口指令碼web/index.php發起請求
2.入口指令碼載入應用配置並建立一個應用例項去處理請求
3.應用通過請求元件解析請求的路由
4.應用建立一個控制器例項去處理請求
5.控制器建立一個動作例項並針對操作執行過濾器
6.如果任何一個過濾器返回失敗,則動作取消
7.如果所有過濾器都通過,動作將被執行
8.動作會載入一個數據模型,或許是來自資料庫
9.動作會渲染一個檢視,把資料模型提供給它
10.渲染結果返回給響應元件
11.響應元件傳送渲染結果給使用者瀏覽器

說聲hello

如何建立一個動作去響應請求
如何建立一個檢視去構造響應內容
以及一個應用如何分派請求給動作

建立動作

操作必須宣告在控制器中,為了簡單起見,直接在SiteController控制器裡宣告say操作。這個控制器是由檔案controllers/SiteController.php定義的

<?php
namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    //  ...現存的程式碼...
    // 為了hello,需要建立一個say操作,
    // 從請求中接收message引數並顯示給終端使用者
    // 如果請求沒有message引數,操作將顯示預設引數Hello
    // say操作被定義為actionSay方法
    // Yii使用action字首區別普通方法和操作
    // action字首後面的名稱被對映為操作的id
    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

給操作命名時,要先理解yii處理操作id。操作id總是被以小寫處理。如果一個操作id由多個單片語成,單詞之間將由連字元連線(如create-comment)。操作id對映為方法名時移除了連字元,將第一個單詞首字母大寫,並加上action字首。如操作id create-comment相當於方法名actionCreateComment

在操作方法中,render()被用來渲染一個名為say的檢視檔案。message引數也被傳入檢視,這樣就可以在裡面使用。操作方法會返回渲染結果。結果會被應用接收並顯示給終端使用者的瀏覽器

當操作中呼叫了render()方法時,它將會按views/控制器ID/檢視名.php路徑載入php檔案

建立檢視

views/site/say.php
message引數被輸出之前被html-encoded方法處理過
因為引數中可能隱含的惡意js程式碼會導致跨站指令碼xss攻擊

<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

say檢視指令碼輸出的內容將會響應結果返回給應用。應用將依次輸出結果給終端使用者

試執行

http://hostname/index.php?r=site/say&message=Hello+World

會輸出hello world的頁面

新頁面和其它頁面使用同樣的頭部和尾部是因為render()方法會自動把say檢視執行的結果嵌入稱為佈局的檔案中,本例中是views/layouts/main.php

上面url引數r代表路由,指向特定操作的獨立id。路由格式是控制器id/操作id。應用接受請求的時候會檢查引數,使用控制器id去確定哪個控制器被用來處理請求。然後相應控制器將使用操作id去確定哪個操作方法將被用來做具體工作。上述例子中,路由site/say將被解析至SiteController控制器和基本的say操作

使用表單

建立一個讓使用者提交資料的表單頁
為了實現這個目標,需要建立一個操作和兩個檢視外,還需要建立一個模型

建立模型

models/EntryForm.php

namespace app\models;
use Yii;
use yii\base\Model;
class EntryForm extends Model
{
    public $name;
    public $email;
    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}

上面宣告的驗證規則表示
name和email值必填
email的值必須滿足email規則驗證

$model = new EntryForm();
$model->name = 'qiang';
$model->email = 'bad';
//使用validate方法觸發資料驗證
if ($model->validate()) {
    //成功
} else {
    //失敗
    //如果有資料驗證失敗,將把hasErrors屬性設true,想知道具體發生什麼錯誤就呼叫getErrors
}

建立動作

con/SiteController

class SiteController extends Controller
{
    public function actionEntry()
    {
        //使用者提交表單後,
        //操作將會渲染一個名為entry-confirm的檢視去確認使用者輸入的資料,
        //如果沒填表單就提交,或資料驗證不通過,entry檢視將會渲染輸出
        $model = new EntryForm;
        if ($model->load(Yii::$app->request->post())&& $model->validate()) {
            //驗證$model收到的資料
            return $this->render('entry-confirm', ['model' => $model]);
        } else {
            //無論是初始化顯示還是資料驗證錯誤
            return $this->render('entry', ['model' => $model]);
        }
    }
}

建立檢視

site/entry-confirm.php
entry-confirm檢視簡單地顯示提交的name和email資料

<?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表單
site/entry.php
使用了小部件ActiveForm生成html表單
先用begin()和end()分別用來渲染表單的開始和關閉標籤
在這兩個方法之間使用了field()方法建立輸入框
最後使用yii\helpers\Html::submitButton()方法生成提交按鈕

<?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(); ?>

用瀏覽器訪問看是否工作

效果說明

沒輸入正確的資訊時不需要重新整理頁面就能給出錯誤提示
其實資料首先由客戶端js指令碼驗證,然後才會提交給伺服器通過php驗證
警告:客戶端驗證是提高使用者體驗手段,無論是否啟用,服務端驗證都是必須的

輸入框的文字標籤是field()方法生成的,內容就是模型中該資料的屬性名,例如模型中name屬性生成的標籤就是Name,當然這些都是可以自定義的

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

使用資料庫

建立一個從資料表country中讀取資料並顯示

準備資料庫

建立一個名為yii2basic的資料庫
然後在資料庫中建立一個名為 country 的表並插入簡單的資料。可以執行下面的語句:

CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);

配置資料庫連線

config/db.php

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

上面的資料庫連線可以在應用中通過Yii::$app->db表示式訪問

持續更新中……