PhalconCMS源碼解析之多模塊

原文發表於: 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

多模塊文件加載

DI註冊服務

私有服務

在「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羣交流討論:

  • 廣州PHP高端交流羣:158587573
  • Phalcon玩家羣:150237524
相關文章
相關標籤/搜索