因為一個月的短暫停留,我在給朋友搞事情,所以Yii系列的文章耽擱了很長時間,現在又重拾當時的知識,給大伙好好撸下這一系列的博客
提起Yii,雖然是國外的開發者搞的,但是它的作者是華人,這才是讓我們引以為豪的,如果以後有機會薛強回國大力發展PHP事業,我肯定回去他麾下搞事情,為PHP在國內的發展貢獻自己的一份力,雖然現在沒有這個能力,這不薛強沒回來嘛,回來的話那時的我肯定可以的~哈哈哈~
領英上強哥的背景如下:
職務:MicroStrategy 公司擔任構架師
地址:美國首都華盛頓 Metro Area
教育:
杜克大學·計算機科學·博士
浙江大學·計算機科學·碩士
強哥是土生土長的中國人,在美國有固定全職工作,英文很好,同時中文一點問題都沒有!!
好了,話步前言,上節我們已經將Yii2.0完整的安裝到我們的機器中啦,在浏覽器中輸入下面的地址,你就可以訪問你的服務器應用啦~
http://服務器IP/app/yii/web/index.php
出現下面的命令那就對啦~
assets文件夾:assets的作用是方便模塊化,插件化的,一般來說出於安全原因不允許通過url訪問protected下面的文件 ,但是我們又希望將module單獨出來,所以需要使用發布,即將一個目錄下的文件復制一份到assets下面方便通過url訪問。
commands文件夾:控制台腳本存放的地方,自動運行腳本
config文件夾:配置文件存放的文件夾
controller文件夾:MVC中C文件存放的文件夾
mail文件夾:郵件發送目錄,具體干啥的我還在摸索中哈~
models文件夾:MVC中M文件存放的文件夾
runtime:日志文件
tests:測試腳本文件夾
vendor:第三方組件存放,composer下載的組件存放的文件夾,自動幫你autoload
views:MVC中V存放的文件夾
web:web主應用入口腳本存放的位置
以上是整個文件夾的布局,裡面的各個文件有啥用,我會在後續的【應用Yii2.0搭建後台應用框架】中詳細介紹
我這一系列的文章均來自於Yii中文網中對Yii2.0的權威指南,感謝國內開發者對社區的貢獻,感謝翻譯的人,讓我們免去了百度翻譯之苦。
如果大家不太喜歡我的描述,可以去看一下官方對Yii2.0的解釋,很詳細,但很官方,不會調戲你^_^
官方文檔【中文版】:http://www.yiichina.com/doc/guide/2.0
Yii 應用參照模型-視圖-控制器 (MVC)設計模式來組織。不懂MVC?這麼說吧,不管是前端應用還是後端應用,首當其沖的設計模式就是MVC。所以了解它相當有必要!
M模型代表數據、業務邏輯和規則;V視圖展示模型的輸出;C控制器接受出入並將其轉換為模型和視圖命令。
這就是Yii的整個框架結構設計,我們的MVC就是其中的控制器,視圖和模型,他們的各自作用上面也講了下,一般的後端應用,M表示從數據庫、第三方鏈接、本地文件中獲取的數據進行處理,整理,在交給到V端,V端的作用一般是在頁面中反饋給用戶的頁面,如果是以數據的形式返回給用戶,那這個V層就不用做過多的渲染。C層的話主要是連接兩者的作用,C層獲取到用戶的請求,傳給M層,M層處理好數據,反饋給C層,C層再將數據給到V層,V層展示給用戶。MVC模型的便捷之處就是邏輯清晰,每個模塊負責自己的事,有條有理,非常便於初學者理解,是一個入門的模型。
除此之外,Yii還包含其他邏輯處理塊,比方說上面圖中的入口腳本【調用應用一開始必被調用的腳本文件】,應用主體【Yii::$app全局可訪問對象】,應用組件【全局通用的一些工具集】,模塊【業務邏輯單元,每個業務邏輯一個模塊,會讓代碼很清晰】,過濾器【規范行為的對象,在控制器執行之前或之後調用,定義一類特殊的行為】,前端資源和小部件我們先不講,因為是涉及到前端的一些組件內容,後面我會單獨開辟一個系列來講前端知識,我出這一系列的目的主要是針對後台應用~
心細的朋友可能早就發現了,為啥我們在上面的訪問鏈接中後面有個index.php,對,就是它,它就是入口腳本,每次web請求都必須經過它!
http://172.16.122.58/app/yii/web/index.php
一般他都是在web這個目錄下面的,這個是web應用的入口腳本。
還有個入口腳本是啥呢,控制台腳本,下面的那個叫yii的php腳本,啥作用呢,你們想想啊,電商後台中,如果有很多人要調整庫存,是不是調整一次就給改一次呀,肯定不會呀,庫存操作如果調用數據庫太頻繁了,數據庫肯定扛不住的,我們的做法就是先放到類似於Redis的緩存中,等到一定量的時候,或者有個1秒鐘的時候我們給同步一次數據庫,同步的方式就是調用控制台腳本啦,配合Linux的crontab,完美解決數據庫調用過於頻繁的問題。控制台腳本後面我們會介紹,一般業務線中用的還挺多的。
入口腳本主要完成以下工作:
定義全局常量;
注冊 Composer 自動加載器;
包含 Yii 類文件;
加載應用配置;
創建一個應用實例並配置;
調用 yii\base\Application::run() 來處理請求。
<?php // comment out the following two lines when deployed to production defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); (new yii\web\Application($config))->run();
入口腳本是定義全局常量的最好地方,話雖如此,不建議在這裡定義啥全局變量!Yii 支持以下三個常量:
YII_DEBUG:標識應用是否運行在調試模式。當在調試模式下,應用會保留更多日志信息,如果拋出異常,會顯示詳細的錯誤調用堆棧。因此,調試模式主要適合在開發階段使用,YII_DEBUG 默認值為 false。
YII_ENV:標識應用運行的環境。YII_ENV 默認值為 'prod',表示應用運行在線上產品環境。
YII_ENABLE_ERROR_HANDLER:標識是否啟用 Yii 提供的錯誤處理,默認為 true。
autoload.php,讀過我之前文章的朋友肯定對他有印象,PSR-4,自動加載器哈,這個是注冊composer自動加載器的。
Yii.php,包含Yii類的文件路徑。
倒數第二行是加載應用配置。最後一行是運行一個應用,這裡面的$config【web.php】這個文件會在後面詳細解答。
應用主體在入口腳本中創建並能通過表達式 \Yii::$app 全局范圍內訪問。訪問的變量定義在哪兒呢,由於應用主體配置比較復雜,就是剛剛提到的$config,config文件夾中的web.php文件。後面比較復雜的配置都可以放到單個文件中,這是個技巧,即減少了配置文件的代碼行數,也將整個框架清晰很多。
這個裡面定義了很多屬性,我們來分別看下吧。
<?php $params = require(__DIR__ . '/params.php'); $config = [
params這個參數裡的所有變量就被定義在params.php這個文件裡面。
下面是我的項目中配置的一些文件在上方定義
<?php $params = require(__DIR__ . '/params.php'); $rules = require(__DIR__ . '/rules.php'); $aliases = require(__DIR__ . '/aliases.php'); $cacheConfig = require(__DIR__ . '/cache.php');
這裡面主要是params參數,rules路由規則,aliases別名規則,cacheConfig緩存配置,你可能會懷疑,為何db這麼關鍵的沒有配置上來,db是區分環境的,在index.php中會區分stable環境、pro環境還是測試環境做區分。
我們還是回到我們的Yii源碼,配置文件上方配置了params所在的文件,
$config = [ 'id' => 'basic', 'basePath' => dirname(__DIR__), 'bootstrap' => ['log'], 'components' => [ 'request' => [ // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => 'A9BMCrvbxuCEnE39rVpOUECgcBJTnzUH', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], 'errorHandler' => [ 'errorAction' => 'site/error', ], 'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', // send all mails to a file by default. You have to set // 'useFileTransport' to false and configure a transport // for the mailer to send real emails. 'useFileTransport' => true, ], 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], ], ], 'db' => require(__DIR__ . '/db.php'), /* 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], */ ], 'params' => $params, ];
這邊有幾個屬性,id、basePath、bootstrap和components。其他還有幾個比較重要的屬性:aliases、language、modules。
yii\base\Application::id 屬性用來區分其他應用的唯一標識ID。一般配置為程序名稱。必要屬性之一。
yii\base\Application::basePath 指定該應用的根目錄。系統預定義 @app 代表這個路徑。 你如果需要require目錄內的文件,可以使用這個方式找到對應文件。另外一個必要屬性,這個是必須得配置的。
這個屬性很實用,它允許你用數組指定啟動階段yii\base\Application::bootstrap()需要運行的組件。一般後端應用中配置個
'bootstrap' => ['log'],
即可。
這是最重要的屬性,它允許你注冊多個在其他地方使用的應用組件。比方說session、log、db和cache啊,都在這裡面配置的,具體的下一節應用組件中會講到。
該屬性允許你用一個數組定義多個別名。數組的key為別名名稱,值為對應的路徑。
[ 'aliases' => [ '@name1' => 'path/to/path1', '@name2' => 'path/to/path2', ], ]
我的配置裡面都是設置的extension擴展類的別名,extension裡面放置一些基礎調用類,比方說CURL、微信支付等等的。
[ '@ext' => dirname(__DIR__) . '/extensions', ]