先說點沒用的:php
不會選擇,選擇後不堅持,不斷的選擇.這是人生中的一個死循環,前兩一直迷茫.以爲本身前進方向很不明朗.想去學的東西有不少.想學好YII,想學PYTHON 想學學hadoop什麼的,又想研究下mongodb.還想學習redis.這麼多的想法一股腦的涌入個人腦海,一下讓我這個腦殼不堪重負.一下就亂了陣腳.因而靜下心來好好想一想.經歷了幾天的思想掙扎.終於靜下心來,從最想學的開始,研究YII.在網上無心中看見這句話,以爲挺符合我當時的心境的.如今想一想.其實無非是,貴在堅持.css
想好好學習YII的框架,在網上一片好評的框架.但是我發現網上真的不多有可以讓初學者感興趣的文章.全部文章一律的搬官方的指南,或者是翻譯兩本國外的圖書,根本很難理解,很生澀.並且不少地方不適合國內環境.其實不少人學習YII框架的目的無非是HOW(怎麼用).沒有多少人願意去研究WHY.我耗時好幾天去研究YII的框架.我雖然不須要徹底理解YII是如何那麼好的運行的.可是我至少要知道.它大概是怎麼工做的.我該從何入手.作什麼可以影響到YII的運行.前端
進入正題:mysql
YII框架的好處我就很少說了,你們能夠本身去百度上面google一下.至於YII怎麼安裝,可以自動的創建應用之類的云云,你們能夠自行參考YII中文官方網站上面的博客指南和權威指南.我想使用YII作一套CMS.這是個人目的.因而我帶着個人目的去研究了.web
開始深刻.redis
在YII框架創建好了應用以後,目錄結構和下面的差很少 官方網站上有解釋各個目錄都是幹啥地sql
testdrive/ index.php Web 應用入口腳本文件 index-test.php 功能測試使用的入口腳本文件 assets/ 包含公開的資源文件 css/ 包含 CSS 文件 images/ 包含圖片文件 themes/ 包含應用主題 protected/ 包含受保護的應用文件 yiic yiic 命令行腳本 yiic.bat Windows 下的 yiic 命令行腳本 yiic.php yiic 命令行 PHP 腳本 commands/ 包含自定義的 'yiic' 命令 shell/ 包含自定義的 'yiic shell' 命令 components/ 包含可重用的用戶組件 Controller.php 全部控制器類的基礎類 Identity.php 用來認證的 'Identity' 類 config/ 包含配置文件 console.php 控制檯應用配置 main.php Web 應用配置 test.php 功能測試使用的配置 controllers/ 包含控制器的類文件 SiteController.php 默認控制器的類文件 data/ 包含示例數據庫 schema.mysql.sql 示例 MySQL 數據庫 schema.sqlite.sql 示例 SQLite 數據庫 testdrive.db 示例 SQLite 數據庫文件 extensions/ 包含第三方擴展 messages/ 包含翻譯過的消息 models/ 包含模型的類文件 LoginForm.php 'login' 動做的表單模型 ContactForm.php 'contact' 動做的表單模型 runtime/ 包含臨時生成的文件 tests/ 包含測試腳本 views/ 包含控制器的視圖和佈局文件 layouts/ 包含佈局視圖文件 main.php 全部視圖的默認佈局 column1.php 使用單列頁面使用的佈局 column2.php 使用雙列的頁面使用的佈局 site/ 包含 'site' 控制器的視圖文件 pages/ 包含 "靜態" 頁面 about.php "about" 頁面的視圖 contact.php 'contact' 動做的視圖 error.php 'error' 動做的視圖(顯示外部錯誤) index.php 'index' 動做的視圖 login.php 'login' 動做的視圖 system/ 包含系統視圖文件
---------以上摘自官方YII權威指南頁面---------------mongodb
既然骨架創建出來了,不少人估計到這步的時候跟我同樣了.不明覺厲.並且如今的狀態是,摸不着頭腦.我滴個孃親啊,這得從何下手啊.這個時候大多數人作的事情我想和我同樣.確定是現打開index.php看看裏面到底寫了點啥玩意兒.打開了index.php後看見以下代碼了shell
<?php // change the following paths if necessary $yii=dirname(__FILE__).'/../../framework/yii.php'; $config=dirname(__FILE__).'/protected/config/main.php'; // remove the following line when in production mode // defined('YII_DEBUG') or define('YII_DEBUG',true); require_once($yii); Yii::createWebApplication($config)->run();
這幾行我估計你們都看的懂,定義了YII框架所在的目錄,引入了一個main.php的配置文件,而後打開了debug.最後直接調用了Yii::createWebApplication方法.看後面的調用方式,這個方法必定返回了某個類的具體實例.數據庫
看樣子問題轉移到了這個實例究竟是啥滴實例?
而且傳入的$config給實例後,實例幹了些什麼?
調用run方法又幹了些什麼?
當我想繼續研究的時候我發現我進入了追查階段.可是我想的只是怎麼用這個框架.好吧 回到主題.我要作CMS.
作cms的話前端展現和後臺管理必定要分開啊.並且聽說YII支持模塊.因而我參考了幾個國內的YII作的cms後發現大多數人都吧admin寫成了模塊.我也來寫一個模塊.聽說yii有個自動化的工具叫作Gii.因而我配置了Gii.而且生成了我想要的模塊admin模塊.
這個時候Gii會提示咱們在main.php,也就是配置文件的modules裏面添加上模塊的信息.打開了main.php文件以後有讓我大吃一驚.what?爲蝦米是個數組.既然你是數組,我就先把你放在這裏.一會研究你.先無論.把個人模塊添加進來;
'modules'=>array( // uncomment the following to enable the Gii tool//這句就是說取消註釋啓用Gii 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'??????????', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ),//這個是參照官方的文檔添加的Gii模塊,其實原本就已經寫好了,只須要取消註釋就行了 'admin',//這個纔是我添加的admin模塊. ),
先看看效果,訪問http://yourwebroot/index.php?r=admin就可以看到你新建模塊的東西了.此時顯示了你的訪問路徑和兩句幫助信息,說這個頁面是怎麼來滴.在那個控制器下面.並且告訴你要修改什麼文件.此時我發現了一個很不爽的地方就是爲啥你不給我定義控制器名稱的地方,我不想讓個人控制器名稱叫default.好嗎?因而修改了控制器的名稱,和控制器對應的view文件夾名稱還有控制器的文件名稱.可是,此時發現再訪問這個控制器滴時候居然報錯了.說找不到控制器.好吧.我用腳後跟這麼一想,必定是有個地方能設置默認的控制器.待我找找.打開模塊目錄.模塊天然是繼承自模塊基類.當打開模塊目錄後看到的第一個PHP文件裏面的內容以下:
<?php class AdminModule extends CWebModule { public function init() { // this method is called when the module is being created // you may place code here to customize the module or the application //這兩句的意思是這個方法將會在模塊被創建的時候調用.你能夠在這裏編寫代碼用於驗證等工做. //注意到這個模塊繼承自CWebModule,也就是說CWebModule裏面的屬性和方法在這裏會被首先調用,那好,我在這裏天然也能夠設置從模塊的基礎類繼承出來的屬性. //注意此時尚未涉及到控制器. // import the module-level models and components $this->defaultController = '控制器名稱,不帶Controller後綴的,小寫.'; $this->setImport(array( 'admin.models.*', 'admin.components.*', )); } public function beforeControllerAction($controller, $action) { if(parent::beforeControllerAction($controller, $action)) { // this method is called before any module controller action is performed // you may place customized code here //這個地方會在控制器的方法被調用以前執行.也就是說這個地方很適合用來作驗證. return true; } else return false; } }
上面註釋裏面說了 ,我要去參考下CWebModules類裏面定義的屬性和方法.(官方有手冊)果斷找到了裏面定義的defaultController 屬性.因而在init裏面添加了一行$this->defaultController = '控制器名稱,不帶Controller後綴的,小寫.';搞定了控制器.再次訪問咱們的網址http://yourwebroot/index.php?r=admin,OK了,看樣子咱們的設置起做用了.其實在這裏面還有不少咱們能夠設置的屬性.yii的手冊寫的很不錯.雖然一開始我並不知道應該怎麼去讀他.
修改LAYOUT
此時我發現了一個更讓我不可以接受的東西.爲蝦米個人這個模塊會調用和首頁同樣的樣式風格,也就是同樣的視圖模板去渲染啊.這後臺的模板必定是不能和前臺同樣的.因而研究YII的視圖.也就是說此時我要實現的目的是讓admin模塊使用和前臺不同的視圖.在YII的權威指南上咱們能夠找到視圖的說明.上面說視圖分爲佈局,視圖,和小物件.看完以後發現小物件暫時用不到.那我就來看看佈局吧.因爲模塊的目錄結構和網站總體的目錄結構很想.看一下目錄結構.發現控制器有本身單獨的視圖文件夾.layout文件夾裏面放置的是用來渲染的公共部分.在YII裏面,咱們能夠理解爲layout就是一個公共的模板框架.而真正的內容在layout所輸出的content裏面.也就是說在開發的過程當中.咱們先寫好總體的公共部分框架,放在layouts文件夾裏面,而後再在各個控制器單獨對應的視圖文件夾裏面去寫不一樣的地方就好了.這裏面能夠用來渲染數據.好吧,我又用個人腳後跟想了想.必定有個地方可以控制layout目錄.在什麼地方呢.程序的運行邏輯是:
入口文件(載入配置)->模塊文件(配置模塊的一些信息)->調用控制器->調用控制器裏面的方法/動做->渲染視圖文件.
也就是說是在控制器裏面的方法下渲染的視圖文件.參考SiteController裏面的action能夠知道render()方法可以沒有參數就執行.也就是說這個layout的默認屬性應該是被配置在了控制器這一層.
打開控制器文件,以下:
<?php class AdminController extends Controller { public function init(){ $this->layout="application.modules.admin.views.layouts.admin"; } public function actionIndex() { $this->render('index'); } public function actionLogin() { } }
這裏面的AdminController繼承自Controller.經過目錄結構能夠看到這個文件在components目錄下面,並且這個Controller繼承自Ccontroller.那麼我想Ccontroller裏面必定有一個屬性是默認的layout.果真找到了.因而我在裏面設置了layout屬性.若是想讓全部admin模塊下面的layout屬性都指定到這個目錄.咱們能夠參考controller來重寫一個繼承自Ccontroller的類.在裏面設置這個屬性.只要在其子類裏面不去覆蓋這個屬性,那麼咱們設置的這個屬性就會被繼承.這個同上.在手冊上咱們能夠看見有不少屬性能夠去設置.也有不少方法供咱們使用.
到如今,我一共作了幾件事情,首先我修改了模塊裏面的默認控制器,同比我也能夠在做爲模塊中控制器的父類裏面設置每個繼承控制器類的默認動做.我又設置了默認的layout方法.使用的別名路徑.這個是yii提供的一個功能.能夠在權威指南上找到.接下來咱們要作的事情就是針對admin模塊並參考默認的view文件夾來寫後臺的基礎視圖,實現後臺用戶的驗證.而且可以渲染後臺的主頁面,實現後臺登錄用戶的管理.等等等等.這些工做後面在作.還記得上面我提的3個問題麼.
咱們在index.php的入口文件裏面看見yii創建了一個某類的實例而且調用了這個類的run方法.並且還傳入到類裏面一個配置文件.這個究竟是哪一個類的方法呢.追查代碼.咱們會發現這個類是CWebApplication的實例.傳入的config數組必定是用來配置並生成這個類的實例了.也就是說這個配置文件是被CwebApplication這個類來解析的.具體的解析在這個類的基類CModule中的configure()方法上面.能夠看手冊本身去追.這樣說也就是意味着全部寫在config數組裏面的配置對會逐一的被配置到CwebApplication這個類上面.因此咱們能夠參考這個類的手冊來寫數組.打個比方來講.在這個類裏面有一個參數叫作layout;咱們在配置數組裏面寫以下的參數 'layout' => '這裏寫一個路徑別名'; 那麼在沒有他處指定layout的狀況下這個默認的layout就會被使用.
而這個配置文件裏面又包含了數組.一樣會被解析.例如modules裏面的數組 咱們一樣能夠配置module的各個屬性在配置數組裏面,例如上面的admin模塊中,咱們能夠這樣配置
'modules'=>array( // uncomment the following to enable the Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'zhangjian.123!', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), 'admin'=>array( 'defaultController'=>'admin', 'layout'=>'設置layout的路徑',
//在這裏能夠設置全部admin模塊所繼承的基類的屬性.能夠看手冊Ccontroller裏面的各個屬性.
//在這裏設置的屬性會在模塊被調用的時候直接被設置成值.
), ),
若是咱們的模塊配置文件比較大.還能夠把這個模塊的配置分離出去.而後在主配置文件裏面去引用這個模塊的配置文件.這樣也方便你們一塊兒開發.固然咱們也能夠在繼承的子類裏面設置本身的屬性.也能夠經過這個來設置.
YII對網站進行了抽象,每個站點實際上都是CwebApplication的一個實例.這個實例裏包含了屬性,方法,而有的屬性是控制器.有的屬性是模塊.有的屬性是組件.就像咱們把一個網站比做一輛小汽車.那麼yii就是一個汽車製造工廠.每一個汽車的組成不一樣.有的有gps定位.有的是手自一體的.網站也就不同.有的使用了cache.有的使用了數據庫.而咱們建設網站就像是組裝汽車同樣.能夠從YII提供的組件裏選擇本身駕輕就熟的組件來應用.或者稍加修改.若是沒有咱們想用的組件.咱們也能夠本身開發一個組件.用在網站上.就像汽車出廠的時候沒有行車記錄儀同樣.咱們能夠給咱們建造的"小汽車"安裝一個行車記錄儀.
對於YII的初體驗就寫到這裏.後面我還想繼續寫..若是以爲本文對你有所幫助,還請幫忙推薦一下.畢竟是我的觀點,若是有什麼地方寫的很差.還但願各位大神指正.