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表示式訪問
持續更新中……