環境說明
服務器環境: CentOS
開發環境及IDE:mac & phpstorm
Yii:v2.0.15 基礎版
接下來開說
開發前
先說說開發前的事情,磨刀不誤砍柴工,將yii2配置到一個最易開發的狀態。
Composer
這個是做yii2開發的基石,除非沒有辦法使用,否則請不要放棄,除了更容易的安裝yii2及第三方擴展外,能使用Composer代表著你的服務器最少能運行起來php-cli,那么你就可以使用yii命令行,它會為你的開發帶來無盡的遍歷。
對于composer,有些關鍵詞你要特別關注 install、update、require。
中文化
默認安裝yii2時,程序的相關信息是英文的,第一步我們需要改成中文的,很簡單。
靜態緩存問題
在用yii2的時候,我們習慣將靜態文件(圖片、css文件、js文件等)放到資源類中管理,但是可能存在瀏覽器緩存問題,在開發階段可以通過配置來避免這個問題,尤其是開發移動端頁面的時候特別有用。
配置DB
雖然yii2對數據庫,尤其是對mysql是很友好的,但是我們還是應該使用穩定高一點的版本,別說你的程序將來沒有移動端,早早的選擇一個支持emoji的數據庫會避免我們下載第三方庫去解決報錯問題。
如果可以
mysql5.3.3 +
config/db.php 的charset=utf8mb4
配置debug
如果可能,請配置一個類似于xdebug的PHP擴展并且集成到你的IDE中,開發過程中難免遇到不好捕獲的bug,這需要你在一個yii2生命周期內持續的觀察某些變量的值及賦值路徑,具體配置可以參考我之前的課程, 用xdebug支持yii2調試之 - PhpStorm配置篇
當然,yii2自己的debug擴展也極其有用,尤其配置urlManager的時候。
開發中
本段為你介紹我在yii2開發中一些習慣和小技巧,希望對你有用。
單一職責
一個類和一個方法應該只有一個職責,比如下面的代碼
比如上面的情況我們最好是將對是否為管理員的判斷單獨提取出來,如下
每個方法是一個最小化的問題解決單元,相關知識可以看下《重構 - 既有代碼的改善》這本書,北哥大約三年前讀過,很多小技巧,受益頗多。
模型的重要性
很多yii2的初學者喜歡將大量邏輯寫到控制器的動作(action)中,這是不對的,我們的重點應該在模型中,而控制器僅僅是做輸入輸出。
我們拿關聯舉個例子,下面的這段代碼是不好的。
我們最好將這段邏輯放到會員模型中
控制器的代碼力求簡單,只做基本的輸入帥選以及輸出渲染。
規則
對與錯,不要隨便就寫。
上面的代碼再熟悉不過了,這是我們期望的樣子,但是有的時候輸入并不會這樣老實,我們需要進行更多驗證,請不要將驗證直接寫到action內,比如上面代碼中的if判斷。
將驗證的工作交給模型的rule和場景吧。一切。
復用隨時要想到(小掛件)
編碼的原則是盡最大努力讓代碼復用,尤其是小掛件,它讓視圖層實現了復用,小掛件的使用非常簡單
1、在@app下建立一個文件夾components
2、在components內建立一個掛件類(必須繼承yii\base\Widget)
3、渲染一個小掛件的視圖(如果需要,在components/views下)
4、使用它
沒看明白?我給個例子。
寫一個視圖
使用它
當然掛件可以很復雜,比如我們使用的ActiveForm、GridView等。關于小掛件我之前也寫了一篇文章,有興趣的同學可以看看。 傳送門
AR關聯的循環要很小心
這個問題我之前也視頻說過,就是惰性加載和即時加載的問題,比如下面的代碼并不好
上面的代碼執行了101次查詢,如果數據更多那?對于上面的問題我們是這樣解決的。
從101次查詢減少到2次。
讓你的代碼更加“簡潔”
這里說的簡潔并不是說代碼量,而是表意。比如下面的代碼
代碼邏輯很簡單的時候我們都喜歡第二種方式,但是如果邏輯復雜些,我更喜歡方式1,雖然它可能很多行,但是表意簡潔,你能看懂、他也能看懂。
何苦廢了牛勁去寫一個自我感覺巨牛逼的表達式那!!!
為視圖的PHP代碼增加一個try
在寫action或模型方法的時候,為了保證代碼的穩定性,我們一般都會用try….catch語法結構,但是在yii2的視圖內很少有人用,記住,也要用! 比如下面這段代碼。
如果上面代碼出錯了怎么辦,我推薦如下方式寫
小心使得萬年船。
勿寫死,用常量或配置。
有些代碼需要一些判斷,而判斷的參考是某些值,比如下面的代碼
我推薦這樣寫
ARTICLE_TYPE 和 TOPIC_TYPE是Item模型的兩個常量。
使用遷移腳本
我說過了很多次,本篇還是要說一次,對于一個yii2程序的數據庫部分請用migration來管理。
并且這些腳本應該一起放到到你的版本控制里,記住,遷移腳本一般包含兩個部分。
結構腳本
種子數據的導入
很多人都忽略了第二類。另外在做遷移腳本的時候,如果你的表有前綴,那么在腳本里的寫法如下
時間問題
使用yii2開發mysql類web應用的時候,數據表的時間類字段我們喜歡用時間戳,一般表內都會有記錄生成時間和更新時間字段。
對于他們的更新請使用yii2內置的TimestampBehavior行為類,則字段數據的填充我們就無需操心了,如下代碼
因此在數據表中我推薦時間字段命名規則如下
生成時間 created_at
更新時間 updated_at
這樣如上代碼就完全夠用了,無需指定字段。
記住:去掉在rules內對created_at和updated_at字段required的限制。
是父類還是行為
其實我是不排斥任何一種的,各有利弊吧,父類使用簡單但是增加了耦合,行為耦合度低但是配置比直接父類復雜些。
當然從理念上說也有點不同
行為 一些類附加的屬性
父類 一些類共同的屬性
我的用法(不一定就是對的),尤其在模塊中我喜歡為控制器增加一層父類。
開發完
程序開發完還需要對yii2程序進行一些配置,很多你一定已經會了。
入口文件
我們首先要改變yii2的運行模式,從開發模式變為生產模式,一般代碼如下
報錯頁面
對于一個穩定的程序,報錯不要緊,要緊的是報錯后的處理,既然用戶覺得有好又對開發人員有幫助,我之前寫過一篇文章,你可以看下 《用yii2實現youtube風格的錯誤處理頁面》
urlManager
嚴格來說這個應該在開發階段做,為了對搜索引擎更有好,也為了增加程序的安全性,我們應該對url進行美化,比如
具體關于urlManager的配置及常用web服務器配置可以看下我之前寫的速查表,有現成的代碼。
小結
一不小心寫了這么多,當然yii2開發要注意的地方何止這些,以后慢慢說。
服務器環境: CentOS
開發環境及IDE:mac & phpstorm
Yii:v2.0.15 基礎版
接下來開說
開發前
先說說開發前的事情,磨刀不誤砍柴工,將yii2配置到一個最易開發的狀態。
Composer
這個是做yii2開發的基石,除非沒有辦法使用,否則請不要放棄,除了更容易的安裝yii2及第三方擴展外,能使用Composer代表著你的服務器最少能運行起來php-cli,那么你就可以使用yii命令行,它會為你的開發帶來無盡的遍歷。
對于composer,有些關鍵詞你要特別關注 install、update、require。
中文化
默認安裝yii2時,程序的相關信息是英文的,第一步我們需要改成中文的,很簡單。
// config/web.php 'language'=>'zh-CN'
靜態緩存問題
在用yii2的時候,我們習慣將靜態文件(圖片、css文件、js文件等)放到資源類中管理,但是可能存在瀏覽器緩存問題,在開發階段可以通過配置來避免這個問題,尤其是開發移動端頁面的時候特別有用。
// config/web.php 'assetManager'=>[ 'appendTimestamp' => true ],
配置DB
雖然yii2對數據庫,尤其是對mysql是很友好的,但是我們還是應該使用穩定高一點的版本,別說你的程序將來沒有移動端,早早的選擇一個支持emoji的數據庫會避免我們下載第三方庫去解決報錯問題。
如果可以
mysql5.3.3 +
config/db.php 的charset=utf8mb4
配置debug
如果可能,請配置一個類似于xdebug的PHP擴展并且集成到你的IDE中,開發過程中難免遇到不好捕獲的bug,這需要你在一個yii2生命周期內持續的觀察某些變量的值及賦值路徑,具體配置可以參考我之前的課程, 用xdebug支持yii2調試之 - PhpStorm配置篇
當然,yii2自己的debug擴展也極其有用,尤其配置urlManager的時候。
開發中
本段為你介紹我在yii2開發中一些習慣和小技巧,希望對你有用。
單一職責
一個類和一個方法應該只有一個職責,比如下面的代碼
function getFullName(){ $isAdmin = Administrator::find()->where(['user_id'=>$this->id])->one(); if($isAdmin && $this->xxx == 1){ return $this->first_name . " " . $this->last_name; } }
比如上面的情況我們最好是將對是否為管理員的判斷單獨提取出來,如下
function getFullName(){ if($this->isAdmin() && $this->xxx == 1){ return $this->first_name . " " . $this->last_name; } } function isAdmin(){ return Administrator::find()->one(); }
每個方法是一個最小化的問題解決單元,相關知識可以看下《重構 - 既有代碼的改善》這本書,北哥大約三年前讀過,很多小技巧,受益頗多。
模型的重要性
很多yii2的初學者喜歡將大量邏輯寫到控制器的動作(action)中,這是不對的,我們的重點應該在模型中,而控制器僅僅是做輸入輸出。
我們拿關聯舉個例子,下面的這段代碼是不好的。
// 某個控制器 public function actionIndex(){ // 這里還有很多代碼 .... // 獲得三天前的某個會員的訂單集合 $order = Order::find()->where(["user_id"=>$userId])->andWhere([">","created_at",strtotime(date("Y-m-d",time()))-86400*3])->all(); }
我們最好將這段邏輯放到會員模型中
// User模型 public function recent3DaysOrders(){ return Order::find()->where(["user_id"=>$this->id])->andWhere([">","created_at",strtotime(date("Y-m-d",time()))-86400*3])->all(); } // 控制器中 public function actionIndex(){ $order = $user->recent3DaysOrders(); }
控制器的代碼力求簡單,只做基本的輸入帥選以及輸出渲染。
規則
對與錯,不要隨便就寫。
// 某個控制器的action中 public function actionCreate(){ $model = new User(); if(Yii::$app->request->isPost){ $model->load(Yii::$app->request->post()); if($model->xxx == xxxx){ // todo } if($model->save()){ // } } }
上面的代碼再熟悉不過了,這是我們期望的樣子,但是有的時候輸入并不會這樣老實,我們需要進行更多驗證,請不要將驗證直接寫到action內,比如上面代碼中的if判斷。
將驗證的工作交給模型的rule和場景吧。一切。
復用隨時要想到(小掛件)
編碼的原則是盡最大努力讓代碼復用,尤其是小掛件,它讓視圖層實現了復用,小掛件的使用非常簡單
1、在@app下建立一個文件夾components
2、在components內建立一個掛件類(必須繼承yii\base\Widget)
3、渲染一個小掛件的視圖(如果需要,在components/views下)
4、使用它
沒看明白?我給個例子。
// components/Top10.php <?php namespace app\components; use yii\base\Widget; class Top10 extends Widget { public function init(){ parent::init(); } public function run(){ parent::run(); return $this->render('top10'); } }
寫一個視圖
// components/views/top10.php <h1>Hello Top10</h1>
使用它
// 某個視圖 <?= \app\components\Top10::widget();?>
當然掛件可以很復雜,比如我們使用的ActiveForm、GridView等。關于小掛件我之前也寫了一篇文章,有興趣的同學可以看看。 傳送門
AR關聯的循環要很小心
這個問題我之前也視頻說過,就是惰性加載和即時加載的問題,比如下面的代碼并不好
$customers = Customer::find()->limit(100)->all(); foreach ($customers as $customer) { // SELECT * FROM `order` WHERE `customer_id` = ... $orders = $customer->orders; }
上面的代碼執行了101次查詢,如果數據更多那?對于上面的問題我們是這樣解決的。
// SELECT * FROM `customer` LIMIT 100; // SELECT * FROM `orders` WHERE `customer_id` IN (...) $customers = Customer::find() ->with('orders') ->limit(100) ->all(); foreach ($customers as $customer) { // 沒有任何的 SQL 執行 $orders = $customer->orders; }
從101次查詢減少到2次。
讓你的代碼更加“簡潔”
這里說的簡潔并不是說代碼量,而是表意。比如下面的代碼
// 方式1 if($num > 100){ return 1 }else{ return 2 } // 方式2 return $num > 100 ? 1 : 2;
代碼邏輯很簡單的時候我們都喜歡第二種方式,但是如果邏輯復雜些,我更喜歡方式1,雖然它可能很多行,但是表意簡潔,你能看懂、他也能看懂。
何苦廢了牛勁去寫一個自我感覺巨牛逼的表達式那!!!
為視圖的PHP代碼增加一個try
在寫action或模型方法的時候,為了保證代碼的穩定性,我們一般都會用try….catch語法結構,但是在yii2的視圖內很少有人用,記住,也要用! 比如下面這段代碼。
// 視圖內 <?= \app\components\WechatLangSideMenu::widget();?>
如果上面代碼出錯了怎么辦,我推薦如下方式寫
<?php try { echo \app\components\WechatLangSideMenu::widget(); }catch(\Exception $e){ // 可以不處理也可以寫你自己的錯誤處理。 } ?>
小心使得萬年船。
勿寫死,用常量或配置。
有些代碼需要一些判斷,而判斷的參考是某些值,比如下面的代碼
if($this->type === 1){ return "文章"; }else if($this->type === 2){ return "專欄"; }
我推薦這樣寫
if($this->type === Item::ARTICLE_TYPE){ return "文章"; }else if($this->type === Item::TOPIC_TYPE){ return "專欄"; }
ARTICLE_TYPE 和 TOPIC_TYPE是Item模型的兩個常量。
使用遷移腳本
我說過了很多次,本篇還是要說一次,對于一個yii2程序的數據庫部分請用migration來管理。
并且這些腳本應該一起放到到你的版本控制里,記住,遷移腳本一般包含兩個部分。
結構腳本
種子數據的導入
很多人都忽略了第二類。另外在做遷移腳本的時候,如果你的表有前綴,那么在腳本里的寫法如下
{{%user}}// discuz_user
時間問題
使用yii2開發mysql類web應用的時候,數據表的時間類字段我們喜歡用時間戳,一般表內都會有記錄生成時間和更新時間字段。
對于他們的更新請使用yii2內置的TimestampBehavior行為類,則字段數據的填充我們就無需操心了,如下代碼
namespace app\models; use Yii; use yii\behaviors\TimestampBehavior; class Article extends \yii\db\ActiveRecord { public function behaviors(){ return [ [ 'class' => TimestampBehavior::className(), ] ]; } }
因此在數據表中我推薦時間字段命名規則如下
生成時間 created_at
更新時間 updated_at
這樣如上代碼就完全夠用了,無需指定字段。
記住:去掉在rules內對created_at和updated_at字段required的限制。
是父類還是行為
其實我是不排斥任何一種的,各有利弊吧,父類使用簡單但是增加了耦合,行為耦合度低但是配置比直接父類復雜些。
當然從理念上說也有點不同
行為 一些類附加的屬性
父類 一些類共同的屬性
我的用法(不一定就是對的),尤其在模塊中我喜歡為控制器增加一層父類。
開發完
程序開發完還需要對yii2程序進行一些配置,很多你一定已經會了。
入口文件
我們首先要改變yii2的運行模式,從開發模式變為生產模式,一般代碼如下
// index.php defined('YII_DEBUG') or define('YII_DEBUG', false); defined('YII_ENV') or define('YII_ENV', 'prod');
報錯頁面
對于一個穩定的程序,報錯不要緊,要緊的是報錯后的處理,既然用戶覺得有好又對開發人員有幫助,我之前寫過一篇文章,你可以看下 《用yii2實現youtube風格的錯誤處理頁面》
urlManager
嚴格來說這個應該在開發階段做,為了對搜索引擎更有好,也為了增加程序的安全性,我們應該對url進行美化,比如
/index.php?r=admin/user/index // 寫成 /admin/user-index.html
具體關于urlManager的配置及常用web服務器配置可以看下我之前寫的速查表,有現成的代碼。
小結
一不小心寫了這么多,當然yii2開發要注意的地方何止這些,以后慢慢說。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/6796/
- 轉載請注明:轉載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料
查 看2022高級編程視頻教程免費獲取