安裝
composer
全局鏡像切換(阿里云 )
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
安裝composer-asset-plugin
composer global require "fxp/composer-asset-plugin"
安裝yii2
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
composer update
應(yīng)用結(jié)構(gòu)
應(yīng)用中最重要的目錄和文件(假設(shè)應(yīng)用根目錄是 basic
):
basic/ 應(yīng)用根目錄
composer.json Composer 配置文件, 描述包信息
config/ 包含應(yīng)用配置及其它配置
console.php 控制臺(tái)應(yīng)用配置信息
web.php Web 應(yīng)用配置信息
commands/ 包含控制臺(tái)命令類
controllers/ 包含控制器類
models/ 包含模型類
runtime/ 包含 Yii 在運(yùn)行時(shí)生成的文件偎捎,例如日志和緩存文件
vendor/ 包含已經(jīng)安裝的 Composer 包率挣,包括 Yii 框架自身
views/ 包含視圖文件
web/ Web 應(yīng)用根目錄胖眷,包含 Web 入口文件
assets/ 包含 Yii 發(fā)布的資源文件(javascript 和 css)
index.php 應(yīng)用入口文件
yii Yii 控制臺(tái)命令執(zhí)行腳本
請求生命周期
使用
第一次問候
1鹃愤、動(dòng)作命名
在控制器中慌核,如果執(zhí)行一個(gè)操作(即方法) 绵载,action作為前綴+操作ID蛔翅。
一個(gè)操作 ID 由多個(gè)單詞組成门驾, 單詞之間將由連字符連接(如 create-comment
)学搜。
操作 ID 映射為方法名時(shí)移除了連字符娃善,將每個(gè)單詞首字母大寫论衍,并加上 action
前綴。 例子:操作 ID create-comment
相當(dāng)于方法名 actionCreateComment
聚磺。
2饲齐、創(chuàng)建視圖
當(dāng)一個(gè)操作中調(diào)用了 render() 方法時(shí), 它將會(huì)按 views/控制器 ID/視圖名.php
路徑加載 PHP 文件咧最。
- 如何創(chuàng)建一個(gè)動(dòng)作去響應(yīng)請求捂人,
- 如何創(chuàng)建一個(gè)視圖去構(gòu)造響應(yīng)內(nèi)容,
- 以及一個(gè)應(yīng)用如何分派請求給動(dòng)作矢沿。
url : http://localhost/?r=site/say&message=hello+world
- 創(chuàng)建動(dòng)作
namespace app\controllers;
class SiteController extends Controller
{
public function actionSay($message='Hello')
{
return $this->render('say', ['message' => $message, 'age' => 10]);
}
}
- 創(chuàng)建視圖
views/site/say.php
參數(shù)在輸出之前被 HTML-encoded 方法處理過滥搭。
<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>
輸出:
表單使用
目標(biāo)
1、創(chuàng)建模型
<?php
namespace app\models;
use \yii\base\Model;
class EntryForm extends Model
{
//模型的三個(gè)屬性捣鲸,需要和form表單的字段對應(yīng)
public $email;
public $name;
public $age;
/*
*聲明規(guī)則來驗(yàn)證輸入的數(shù)據(jù)
*/
public function rules()
{
return [
[['email', 'name'], 'required'],//驗(yàn)證表單屬性必填
['email','email'],//郵箱必須符合格式
['age','number'],//年齡必須符合數(shù)字
];
}
}
2瑟匆、創(chuàng)建動(dòng)作
namespace app\controllers;
class SiteController extends Controller
{
/**
* @api {GET} index?r=Site/entry 02使用表單
* @return string
*/
public function actionEntry()
{
$model = new EntryForm();
//實(shí)例化模型
/**
表達(dá)式 Yii::$app 代表應(yīng)用實(shí)例,它是一個(gè)全局可訪問的單例栽惶。 同時(shí)它也是一個(gè)服務(wù)定位器愁溜, 能提供 request,response外厂,db 等等特定功能的組件冕象。 在上面的代碼里就是使用 request 組件來訪問應(yīng)用實(shí)例收到的 $_POST 數(shù)據(jù)。
**/
//使用Yii 的request來采集表單數(shù)據(jù) 并且交給模型去驗(yàn)證
if($model->load(Yii::$app->request->post()) && $model->validate())
{
//通過驗(yàn)證 將數(shù)據(jù)響應(yīng)給視圖entry-confirm
//var_dump(Yii::$app->request->post());
//todo...
return $this->render('entry-confirm', ['model' => $model]);
}else{
//不通過驗(yàn)證則將 提示信息返回 給視圖entry
return $this->render('entry', ['model' => $model]);
}
}
}
3汁蝶、視圖代碼
views/site/entry.php渐扮。
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<!--表單開始-->
<?php $form = ActiveForm::begin(); ?>
<!--姓名-->
<?= $form->field($model, 'name') ?>
<!--郵件-->
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'age') ?>
<!--提交按鈕-->
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<!--表單結(jié)束-->
<?php ActiveForm::end(); ?>
views/site/entry-confirm
<?php
namespace app\models;
use \yii\base\Model;
class EntryForm extends Model
{
public $email;
public $name;
public $age;
public function rules()
{
return [
[['email', 'name'], 'required'],
['email','email'],
['age','number']
];
}
}
視圖使用了一個(gè)功能強(qiáng)大的小部件 ActiveForm 去生成 HTML 表單。 其中的
begin()
和end()
分別用來渲染表單的開始和關(guān)閉標(biāo)簽掖棉。 在這兩個(gè)方法之間使用了 field() 方法去創(chuàng)建輸入框墓律。 第一個(gè)輸入框用于 “name”,第二個(gè)輸入框用于 “email”幔亥。 之后使用 yii\helpers\Html::submitButton() 方法生成提交按鈕耻讽。
效果1:
效果2:
數(shù)據(jù)庫使用
目標(biāo):
- 配置一個(gè)數(shù)據(jù)庫連接
- 定義一個(gè)活動(dòng)記錄類
- 使用活動(dòng)記錄從數(shù)據(jù)庫中查詢數(shù)據(jù)
- 以分頁方式在視圖中顯示數(shù)據(jù)
1、配置數(shù)據(jù)庫連接
在config/db.php
文件中有默認(rèn)配置
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=yii2basic',
'username' => 'root',//用戶
'password' => 'root',//密碼
'charset' => 'utf8',
];
2帕棉、創(chuàng)建活動(dòng)記錄
創(chuàng)建一個(gè)繼承自活動(dòng)記錄類的類 Country
针肥, 把它放在 models/Country.php
文件,去代表和讀取 country
表的數(shù)據(jù)笤昨。
<?php
namespace app\models;
class Country extends \yii\db\ActiveRecord
{
}
3祖驱、創(chuàng)建動(dòng)作查詢country數(shù)據(jù)
新開CountryController.php
<?php
namespace app\controllers;
use app\models\Country;
use yii\data\Pagination;
use yii\web\Controller;
class CountryController extends Controller
{
public function actionIndex()
{
$query = Country::find();
//這是一個(gè)分頁類,最終交給視圖中的LinkPager 來渲染分頁
$pagination = new Pagination([
'defaultPageSize' => 5,//默認(rèn)每頁5行
'totalCount' => $query->count(),//數(shù)據(jù)總數(shù)
]);
$countries = $query->orderBy('name')
->offset($pagination->offset)
->limit($pagination->limit)
->all();
return $this->render('index', [
'countries' => $countries,
'pagination' => $pagination,
]);
}
}
4瞒窒、創(chuàng)建視圖
views/country/index.php
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;//渲染分頁的類
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
<li>
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>
</li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>
效果: