使用composer安裝yii
//composer的安裝和介紹
composer global require "fxp/composer-asset-plugin:^1.2.0"
//到web根目錄創(chuàng)建名為learnyii項(xiàng)目
cd /Users/free/www/
composer create-project yiisoft/yii2-app-basic learnyii 2.0.16
我的工作習(xí)慣會(huì)配置一個(gè)虛機(jī)以www為根目錄,再配置一個(gè)虛機(jī)以當(dāng)前開(kāi)發(fā)中的項(xiàng)目為根目錄,配置如下:
// /usr/local/etc/nginx/nginx.conf文件中最后一行 } 大括號(hào)前增加下面這句
include servers/*;
// vi /usr/local/etc/nginx/servers/dtest
// 我的www根目錄
server {
listen 80;
server_name www.dtest.com;
root /Users/free/www/;
access_log /usr/local/var/logs/nginx/default.access.log;
location / {
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
index index.html index.htm index.php;
autoindex on;
include /usr/local/etc/nginx/conf.d/php-fpm;
}
}
// vi /usr/local/etc/nginx/servers/dtemp
//當(dāng)前學(xué)習(xí)yii的項(xiàng)目【learnyii】
server {
listen 80;
server_name www.dtemp.com;
root /Users/free/www/learnyii/web/;
access_log /usr/local/var/logs/nginx/dtemp.access.log;
location / {
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
index index.html index.htm index.php;
autoindex on;
include /usr/local/etc/nginx/conf.d/php-fpm;
}
}
配置好虛機(jī),nginx重新加載配置
sudo nginx -s reload
yii 環(huán)境要求檢查,是否滿足條件查看
//從瀏覽器中可以看到支持情況
http://www.dtest.com/learnyii/requirements.php
//項(xiàng)目查看
http://www.dtemp.com/
應(yīng)用結(jié)構(gòu)【我創(chuàng)建的項(xiàng)目名為learnyii】:
learnyii/ 應(yīng)用根目錄
composer.json Composer 配置文件, 描述包信息
config/ 包含應(yīng)用配置及其它配置
console.php 控制臺(tái)應(yīng)用配置信息
web.php Web 應(yīng)用配置信息
commands/ 包含控制臺(tái)命令類(lèi)
controllers/ 包含控制器類(lèi)
models/ 包含模型類(lèi)
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)用入口文件 //所以nginx虛機(jī)web根目錄設(shè)置為/Users/free/www/learnyii/web/
yii Yii 控制臺(tái)命令執(zhí)行腳本
Yii 實(shí)現(xiàn)了模型-視圖-控制器 (MVC)設(shè)計(jì)模式

請(qǐng)求到learnyii/web/index.php這個(gè)入口文件,該文件會(huì)加載框架應(yīng)用主體,加載框架封裝好的方法和類(lèi),根據(jù)請(qǐng)求路徑,會(huì)有路由模塊進(jìn)行解析交給對(duì)應(yīng)的控制器下的action方法進(jìn)行處理,通過(guò)model類(lèi)可以方便地操作數(shù)據(jù)庫(kù),拿到數(shù)據(jù)之后交給視圖去顯示這些數(shù)據(jù),在視圖中調(diào)用小部件【系統(tǒng)封裝的方法和類(lèi)】可以省去自己編寫(xiě)某些樣式和結(jié)構(gòu)的時(shí)間。
命名空間
新建項(xiàng)目learnyii,site控制器index action作為默認(rèn)控制器和處理方法,可以看到命名空間為app\controllers,app對(duì)應(yīng)learnyii文件夾代表開(kāi)發(fā)主目錄,controllers對(duì)應(yīng)controllers文件夾,命名空間和文件夾的這樣清楚的對(duì)應(yīng)關(guān)系對(duì)自動(dòng)加載類(lèi)十分方便。拿到命名空間就可以確定類(lèi)所在文件夾和文件。規(guī)則:控制器大寫(xiě)字母開(kāi)頭,Controller結(jié)尾,繼承Controller,處理方法以action開(kāi)頭,方法名大寫(xiě)。如actionIndex為Index處理方法

創(chuàng)建自己的控制器,在controllers文件夾中創(chuàng)建TestController.php,訪問(wèn)http://www.dtemp.com/?r=test/index
<?php
namespace app\controllers;
use yii\web\Controller;
class TestController extends Controller
{
public function actionIndex()
{
echo "test me";
}
}
//\Yii這個(gè)全局類(lèi)的靜態(tài)變量$app包含請(qǐng)求組件request
$request = \Yii::$app->request;
var_dump($request->get()); //打印所有g(shù)et請(qǐng)求參數(shù)
var_dump($request->post());//打印所有post請(qǐng)求參數(shù)
var_dump($request->get('name',''));//如果沒(méi)有傳入name參數(shù)則為空串
//request組件的isGet變量可以判斷請(qǐng)求動(dòng)作類(lèi)型
if($request->isGet{
echo 'get 請(qǐng)求';
}
//用戶ip
echo $request->userIP;
//該組件還可以獲取用戶userAgent等等,很強(qiáng)大
php 原生有些方法可以設(shè)置響應(yīng)頭,在框架項(xiàng)目中yii對(duì)返回響應(yīng)做了封裝,我們可以使用response對(duì)響應(yīng)做一些設(shè)置。
//響應(yīng)組件
$response = \Yii::$app->response;
//設(shè)置http響應(yīng)碼
$response->statusCode=500;
使用視圖顯示數(shù)據(jù)
我們使用 echo "test me"; 可以在頁(yè)面顯示這句話,實(shí)際頁(yè)面有豐富的文字、圖片等,我們不可能全部放在控制器中利用echo 打印出來(lái)。yii為我們準(zhǔn)備了視圖。
//第一個(gè)參數(shù)是指明要渲染的頁(yè)面路徑和名稱(chēng),第二個(gè)參數(shù)是要傳入到視圖文件的變量
//yii的規(guī)則是到控制器為名稱(chēng)的文件夾中尋找名為index【可以任意起名】的文件
//該控制器名為T(mén)estController,所以會(huì)去views下的test文件夾中尋找index.php
return $this->renderPartial('index',['name'=>'pipagg','age'=>18]);
views/test/index.php 內(nèi)容:
我的名字 <?= $name ;?><br/>
年齡<?= $age ;?>
render和renderPartial的區(qū)別就是前者會(huì)將視圖內(nèi)容嵌入到一個(gè)layout文件中,默認(rèn)layout為views/layouts/main.php。我們很多頁(yè)面都有相同的部分,比如底部備案信息,聯(lián)系方式等,我們不需要每個(gè)頁(yè)面都寫(xiě)一遍,只要寫(xiě)在一個(gè)文件中,然后在需要這部分內(nèi)容的頁(yè)面使用該layout即可。
return $this->render('index',['name'=>'pipagg','age'=>18]);
//創(chuàng)建自己的layout views/test/mylayout.php
$this->layout='mylayout';
return $this->render('index',['name'=>'pipagg','age'=>18]);
我們可以指定自己的layout,在views/layouts/創(chuàng)建mylayout.php 內(nèi)容:
我是公共頭部 <br/><br/>
<?= $content ?><br/><br/>
我是公共底部
cd ~/www/learnyii/config
vi db.php
//內(nèi)容如下:
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=learnyii',
'username' => 'freeuser',
'password' => 'free99',
'charset' => 'utf8',
];
//創(chuàng)建 learnyii 數(shù)據(jù)庫(kù),創(chuàng)建mems表
CREATE TABLE `mems` (
`uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL DEFAULT '' COMMENT '用戶名',
`password` char(32) NOT NULL DEFAULT '' COMMENT '密碼',
`mobile` char(11) DEFAULT '' COMMENT '手機(jī)號(hào)',
`email` varchar(60) DEFAULT '',
`salt` char(6) DEFAULT '',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用戶表'
//新建mems 表對(duì)應(yīng)的 model,yii中使用model操作數(shù)據(jù)庫(kù),
<?php
namespace app\models;
class Mems extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'mems';
}
}
//\yii\db\ActiveRecord這個(gè)類(lèi)封裝類(lèi)操作數(shù)據(jù)庫(kù)的方法
vi ~/www/learnyii/controllers/TestController.php
開(kāi)頭加 use app\models\Mems;
//actionIndex中加入創(chuàng)建一條用戶記錄
$mem = new Mems();
$mem->name = 'pipagg';
var_dump($mem->save());
//[查詢name為pipagg的記錄](méi)(https://www.yiichina.com/doc/api/2.0/yii-db-activerecord#find()-detail)
$mem = Mems::find('name=:n',array(':n'=>'pipagg'))->asArray()->one();
//$mem = Mems::find()->where(['name' => 'pipagg'])->one();
//更為靈活的方式
$mem = Mems::findBySql('select * from '.Mems::tableName().' where name=:n',array(':n'=>'pipagg'))->asArray()->one();
var_dump($mem);
//如果不使用asArray(),返回的則為ActiveRecord的對(duì)象,
//也就可以使用該對(duì)象的所有方法,比如更新方法update()
$mem = Mems::find()->where(['name' => 'pipagg'])->one();
$mem->name = 'pipaggcn';
var_dump($mem->update());
//以上查詢方法都使用了'name=:n',array(':n'=>'pipagg')這種結(jié)構(gòu),是為了避免sql注入,yii封裝的方法會(huì)防止sql注入
//sql注入的簡(jiǎn)單形式:
// select * from mems where uid=1 or 1=1 用戶傳入的uid為 '1 or 1=1'
//查詢出來(lái)再進(jìn)行刪除
$mem = Mems::find()->where(['name' => 'sky'])->one()->delete();
var_dump($mem);
//刪除uid大于1的所有記錄
var_dump(Mems::deleteAll('uid >:u',array(':u'=>1)));
文檔解釋:
find()會(huì)創(chuàng)建用來(lái)查詢的yii\db\ActiveQueryInterface 實(shí)例。
并返回 yii\db\ActiveQueryInterface實(shí)例,該類(lèi)包含asArray()和one()方法,調(diào)用asArray()返回$this,所以可以再調(diào)用one()
asArray() 設(shè)置是否按數(shù)組而不是活動(dòng)記錄返回查詢結(jié)果。
return $this;查詢對(duì)象本身
one() 查詢結(jié)果的單行,取決于asArray() 的設(shè)置,
查詢結(jié)果可以是數(shù)組或活動(dòng)記錄對(duì)象,如果查詢沒(méi)有結(jié)果將返回 null
$mems = Mems::find()->where(['like', 'name', 'pipagg'])->asArray()->all();
var_dump($mems);
$session = \Yii::$app->session;
$isactive = $session->getIsActive();
var_dump($isactive);
$session->open();
$isactive = $session->getIsActive();
var_dump($isactive);
var_dump($session->get('name')); //NULL
$session->set('name','pipagg'); //設(shè)置鍵為name 值為pipagg
var_dump($session->get('name')); //獲取鍵為name的值
cookie操作response類(lèi)中包含cookie操作方法,該方法接收cookie類(lèi)進(jìn)行操作
//cookie操作
$cookies= \Yii::$app->response->cookies;
$cookies->add(new Cookie(['name'=>'mem','value'=>'pipagg']));
總結(jié):
yii框架目錄結(jié)構(gòu)清晰,學(xué)習(xí)之前可以讓自己先感覺(jué)下什么是MVC,為什么要使用這種結(jié)構(gòu),從php基礎(chǔ)到簡(jiǎn)易MVC,跟著教程了解下,或者直接使用yii去感受MVC,再嘗試自己構(gòu)建一個(gè)MVC框架。yii的類(lèi)封裝層級(jí)不是很扁平,想要應(yīng)用特別熟練,還需動(dòng)手寫(xiě)項(xiàng)目,要了解框架源碼會(huì)更需要耐心。yii2的類(lèi)文檔十分清楚,在使用yii方法時(shí)要注意參數(shù)是哪個(gè)系統(tǒng)類(lèi)還是普通數(shù)據(jù)類(lèi)型,返回值是哪個(gè)系統(tǒng)類(lèi)還是普通類(lèi)型,能夠級(jí)聯(lián)操作的原因就是返回的是類(lèi)對(duì)象,可以再次調(diào)用該對(duì)象的方法。本教程輸入yii簡(jiǎn)單入門(mén),程序地址:
https://github.com/onerole1024/learnyii.git