通過(guò)歸檔文件安裝或者通過(guò)composer下載放在自己的項(xiàng)目中,接下來(lái)開(kāi)始使用yii2。
認(rèn)識(shí)yii2.0
-
什么是yii框架?
快速,安全,專業(yè)的php框架。
-
yii框架有什么用?
非常適合開(kāi)發(fā)web2.0網(wǎng)站,博客,社區(qū)網(wǎng)站,sns,分享服務(wù),內(nèi)容管理系統(tǒng),電子商務(wù)網(wǎng)站,restful web服務(wù)這些應(yīng)用,yii框架都是不錯(cuò)的選擇。
-
為什么要用yii框架
-
開(kāi)發(fā)快
-
代碼優(yōu)雅
-
yii框架?chē)?yán)格按照MVC設(shè)計(jì)代碼,清晰分離邏輯層,代碼嚴(yán)謹(jǐn)優(yōu)雅,可維護(hù)性高
-
安全可靠
yii框架的措施包括了輸入驗(yàn)證,輸入過(guò)濾,sql注入和跨站點(diǎn)腳本的預(yù)防。
yii2.0運(yùn)行原理初探
yii請(qǐng)求道響應(yīng)的生命周期
用戶通過(guò)入口腳本index.php,加載配置文件,啟動(dòng)應(yīng)用(application),解析路由,請(qǐng)求處理組件,創(chuàng)建控制器,創(chuàng)建動(dòng)作執(zhí)行過(guò)濾,通過(guò)模型(從數(shù)據(jù)庫(kù))加載數(shù)據(jù),通過(guò)視圖方法渲染視圖,響應(yīng)處理組件,響應(yīng)給用戶。


- 用戶向入口腳本 web/index.php
發(fā)起請(qǐng)求。 - 入口腳本加載應(yīng)用配置 并創(chuàng)建一個(gè)應(yīng)用實(shí)例去處理請(qǐng)求。
- 應(yīng)用通過(guò)請(qǐng)求組件 解析請(qǐng)求的路由。
- 應(yīng)用創(chuàng)建一個(gè)控制器實(shí)例去處理請(qǐng)求。
- 控制器創(chuàng)建一個(gè)動(dòng)作實(shí)例并針對(duì)操作執(zhí)行過(guò)濾器。
- 如果任何一個(gè)過(guò)濾器返回失敗,則動(dòng)作取消。
- 如果所有過(guò)濾器都通過(guò),動(dòng)作將被執(zhí)行。
- 動(dòng)作會(huì)加載一個(gè)數(shù)據(jù)模型,或許是來(lái)自數(shù)據(jù)庫(kù)。
- 動(dòng)作會(huì)渲染一個(gè)視圖,把數(shù)據(jù)模型提供給它。
- 渲染結(jié)果返回給響應(yīng)組件。
- 響應(yīng)組件發(fā)送渲染結(jié)果給用戶瀏覽器。
應(yīng)用主體
1.應(yīng)用主體 - 是管理Yii應(yīng)用系統(tǒng)整體結(jié)構(gòu)和生命周期的對(duì)象
- 是yii\web\Application類(lèi)的實(shí)例
- 可以用\Yii::$app來(lái)訪問(wèn)應(yīng)用
視圖
- 視圖是mvc模式中view這一部分。
- 視圖實(shí)在yii\web\view應(yīng)用組件的幫助下,依據(jù)視圖模板文件,進(jìn)行構(gòu)造和渲染完成的。
- 習(xí)慣上稱視圖模板文件為視圖。
- 視圖模板文件主要是通過(guò)html代碼和展示類(lèi)php代碼組成的。
-
視圖的布局layout
<?php
/* @var $this \yii\web\View */
/* @var $content string */
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use frontend\assets\AppAsset;
use common\widgets\Alert;
AppAsset::register($this);
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?= Html::csrfMetaTags() ?>
<title><?= Html::encode($this->title) ?></title>
<?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
<div class="wrap">
<?php
NavBar::begin([
'brandLabel' => 'My Company',
'brandUrl' => Yii::$app->homeUrl,
'options' => [
'class' => 'navbar-inverse navbar-fixed-top',
],
]);
$menuItems = [
['label' => 'Home', 'url' => ['/site/index']],
['label' => 'About', 'url' => ['/site/about']],
['label' => 'Contact', 'url' => ['/site/contact']],
];
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Signup', 'url' => ['/site/signup']];
$menuItems[] = ['label' => 'Login', 'url' => ['/site/login']];
} else {
$menuItems[] = '<li>'
. Html::beginForm(['/site/logout'], 'post')
. Html::submitButton(
'Logout (' . Yii::$app->user->identity->username . ')',
['class' => 'btn btn-link']
)
. Html::endForm()
. '</li>';
}
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
'items' => $menuItems,
]);
NavBar::end();
?>
<div class="container">
<?= Breadcrumbs::widget([
'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
]) ?>
<?= Alert::widget() ?>
<?= $content ?>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-left">? My Company <?= date('Y') ?></p>
<p class="pull-right"><?= Yii::powered() ?></p>
</div>
</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
1.什么是布局
布局是一種特殊的視圖,表現(xiàn)多個(gè)視圖的公共部分。
2.如何創(chuàng)建布局
布局也是視圖,它可像普通視圖一樣創(chuàng)建布局默認(rèn)存儲(chǔ)在@app/view/layouts里
3. 如何變換布局
-
更改布局
$this->layout = 'wx';
-
禁用布局
$this->layout = false;
4.布局文件的數(shù)據(jù)
$this 和 $content
- $this指向 yii\web\view 來(lái)管理和渲染這個(gè)視圖文件。
- $content是視圖模板文件渲染出來(lái)的結(jié)果
應(yīng)用主體
1.應(yīng)用主體
- 是管理yii應(yīng)用系統(tǒng)整體結(jié)構(gòu)和生命周期的對(duì)象
- 是yii\web\application類(lèi)的實(shí)例
- 可以用\yii::$app來(lái)訪問(wèn)應(yīng)用
2.應(yīng)用主體的配置
- $config變量給應(yīng)用主體這個(gè)對(duì)象的屬性進(jìn)行初始化賦值。
- $config變量是從配置文件web.php加載而來(lái)的
3.應(yīng)用主體的屬性
- id 用來(lái)區(qū)分其他應(yīng)用主體的標(biāo)識(shí)id
- basePath 應(yīng)用根目錄
- defaultRoute 默認(rèn)打開(kāi)的路由
表單
1.表單的創(chuàng)建
在yii 中主要是通過(guò) yii\widgets\ActiveForm 類(lèi)來(lái)創(chuàng)建表單。
- ActiveForm::begin()不僅創(chuàng)建了一個(gè)表單實(shí)例,同時(shí)也標(biāo)志著表單的開(kāi)始。
- 放在ActiveForm::begin() 與 ActiveForm::end()之間的所有內(nèi)容都被包裹在Html的<form>標(biāo)簽中。
<?php
/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \frontend\models\ContactForm */
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
$this->title = 'Contact';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-contact">
<h1><?= Html::encode($this->title) ?></h1>
<p>
If you have business inquiries or other questions, please fill out the following form to contact us. Thank you.
</p>
<div class="row">
<div class="col-lg-5">
<?php $form = ActiveForm::begin(['id' => 'contact-form']); ?>
<?= $form->field($model, 'name')->textInput(['autofocus' => true]) ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [
'template' => '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>
<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
</div>
</div>
2.ActiveField對(duì)象的使用
<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'username')->textInput(['autofocus' => true])->hint('please enter your name')->label('Name') ?>
<?= $form->field($model, 'email')->input('email') ?>
3. 額外的標(biāo)簽處理
表單中,存在一些和模型對(duì)象沒(méi)有關(guān)系的,額外的HTML標(biāo)簽,比如submitButton我們可以:
- 使用純HTML
- 使用yii\helpers\Html 幫助類(lèi)中的方法來(lái)添加到表單中
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
4. 塊賦值
input中的name,實(shí)際是以對(duì)象名來(lái)命名一個(gè)數(shù)組,數(shù)組的鍵對(duì)應(yīng)模型的屬性。
模型執(zhí)行l(wèi)oad方法,就是對(duì)每個(gè)屬性執(zhí)行這樣一句賦值。
$model->name = isset($ContactForm['name']) ? $contactForm['name'] : null;