yii簡(jiǎn)明教程

使用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)求框架處理過(guò)程

請(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處理方法


命名空間.png

創(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";
    }

}

處理請(qǐng)求之獲取請(qǐng)求參數(shù)

//\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)大

返回響應(yīng)數(shù)據(jù)之設(shè)置響應(yī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/>
我是公共底部

操作數(shù)據(jù)庫(kù),增刪改查

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

where 條件可以寫(xiě)的很復(fù)雜

$mems = Mems::find()->where(['like', 'name', 'pipagg'])->asArray()->all();
var_dump($mems);

session操作

點(diǎn)擊理解session和cookie

$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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PHP學(xué)習(xí)線路圖 PHP教程 PHP教程PHP簡(jiǎn)介PHP環(huán)境設(shè)置PHP語(yǔ)法概述PHP變量類(lèi)型PHP常量類(lèi)型 PHP...
    茶茶點(diǎn)閱讀 814評(píng)論 1 4
  • 一、入口文件 入口文件內(nèi)容:一般格式如下: 二、主配置文件 保存位置:你的應(yīng)用/protected/config/...
    layjoy閱讀 1,257評(píng)論 4 14
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,658評(píng)論 1 32
  • 1、PHP語(yǔ)言的一大優(yōu)勢(shì)是跨平臺(tái),什么是跨平臺(tái)?一、PHP基礎(chǔ): PHP的運(yùn)行環(huán)境最優(yōu)搭配為Apache+MySQ...
    __書(shū)山有路__閱讀 1,612評(píng)論 0 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,338評(píng)論 4 61

友情鏈接更多精彩內(nèi)容