原文發表於: PhalconCMS源碼解析之多模塊
在2016年的最後一天裏,把PhalconCMS 1.0版完成開發、封版並上線部署以後,我一直在想是否須要整理一個源碼解析類的系列教程。雖然PhalconCMS的源碼組織並非很複雜,稍微有點Phalcon基礎的同窗就能看明白,可是不少剛入門的同窗對於Phalcon的知識點都是隻知其一;不知其二的狀態,並無一個系統的認知。因此我仍是決定寫PhalconCMS源碼解析這個系列教程,跟你們分享我在學習使用Phalcon以及開發PhalconCMS的過程當中的一些經驗和總結。一方面呢,我自身對於Phalcon知識點的理解和總結,也不是很是的系統和全面,也是但願藉助這個機會,能和更多的Phalcon愛好者互相交流學習;另外一方面也是但願能給剛接觸Phalcon的同窗一些啓發,幫助他們少走彎路。但願不會是誤人歧途 :) php
這一篇跟你們分享一下PhalconCMS多模塊的代碼組織。在PhalconCMS中有「前臺(app/frontend目錄)」和「後臺(app/backend目錄)」兩個模塊,分別對應着訪客和管理員的用戶羣體。下面直接經過代碼來分析。html
在「app/core/loader.php」文件中,對「前臺模塊」和「後臺模塊」的「controllers」、「models」文件目錄進行加載。這裏是用的命名空間加載(registerNamespaces)方式,也能夠用自動加載(registerDirs)來處理。git
在「app/frontend/FrontendModule.php」和「app/Backend/BackendModule.php」文件中分別向DI註冊前臺和後臺模塊所需的"dispathcer調度器服務"、「url服務」以及「view模板服務」。這裏須要注意的是,先後臺的「dispatcher調度器服務」中設置的「默認調度器」是不同的:github
//app/frontend/FrontendModule.php中默認設置爲前臺的調度器 $dispatcher->setDefaultNamespace('Marser\\App\\Frontend\\Controllers'); //app/Backend/BackendModule.php默認設置爲後臺的調度器 $dispatcher -> setDefaultNamespace('Marser\\App\\Backend\\Controllers');
同理,先後臺的「url服務」中設置的"URL前綴"也是不同的。這是爲了在程序中調用生成URL的方法($url->get("test/test"); )時,自動根據當前模塊來設置URL的前綴:shell
//app/frontend/FrontendModule.php中設置的前臺URL前綴 $url -> setBaseUri('/'); //會生成"/test/test"的URL $url -> get('test/test'); //app/Backend/BackendModule.php中設置的後臺URL前綴 $url -> setBaseUri('/admin/'); //會生成「/admin/test/test」的URL $url -> get('test/test');
在 「app/core/services.php」 文件中向DI註冊多模塊共用的公用服務,如路由服務、數據庫鏈接服務、緩存服務、日誌服務等等。
多模塊的路由服務以下:數據庫
$di -> set('router', function(){ $router = new \Phalcon\Mvc\Router(); //默認路由到前臺模塊 $router -> setDefaultModule('frontend'); //後臺模塊經過路由規則指定 $routerRules = new \Phalcon\Config\Adapter\Php(ROOT_PATH . "/app/config/routers.php"); foreach ($routerRules->toArray() as $key => $value){ $router->add($key,$value); } return $router; });
"app/config/routes.php"中設置的路由規則以下:瀏覽器
//後臺路由規則 '/admin/:controller/:action/:params' => array( 'module' => 'backend', 'controller'=>1, 'action'=>2 ),
以上步驟完成以後,最後在"app/public/index.php"中註冊多模塊:緩存
$application -> registerModules(array( 'frontend' => array( 'className' => 'Marser\App\Frontend\FrontendModule', 'path' => ROOT_PATH . '/app/frontend/FrontendModule.php', ), 'backend' => array( 'className' => 'Marser\App\Backend\BackendModule', 'path' => ROOT_PATH . '/app/backend/BackendModule.php', ), ));
至此,PhalconCMS的多模塊就能正常運行了。在瀏覽器中訪問帶有「/admin/」 前綴的URL,"dispatcher調度服務"就能將請求URL分發到後臺的控制器中("app/backend/controllers"),其餘的URL請求,就默認分發到前臺控制器("app/frontend/controllers")。
以上貼的都是代碼片段,具體代碼能夠參考PhalconCMS的源碼:
碼雲: http://git.oschina.net/KevinJ...
github:https://github.com/KevinJay/P...app
同時,我也抽取了一份phalcon的示例代碼倉庫,phalcon多模塊的示例代碼已經提交上去了,後續教程的demo也會提交上去,歡迎你們star和fork:
https://github.com/KevinJay/m...frontend
最後,歡迎你們加入QQ羣交流討論: