多模塊的應(yīng)用使用了相同的文檔根目錄但擁有多個(gè)模塊。在這種情況下,可以使用以下的文件目錄結(jié)構(gòu):
multiple/ apps/ frontend/ controllers/ models/ views/ Module.php backend/ controllers/ models/ views/ Module.php public/ css/ img/ js/
在`apps/下的每一個(gè)目錄都有自己的 MVC 結(jié)構(gòu)。`Module.php 文件定義了各個(gè)模塊不同的配置,如自動加載器、視圖和自定義服務(wù):
<?php namespace Multiple\Backend; use Phalcon\Loader; use Phalcon\Mvc\View; use Phalcon\DiInterface; use Phalcon\Mvc\Dispatcher; use Phalcon\Mvc\ModuleDefinitionInterface; class BackendModule implements ModuleDefinitionInterface { /** * 注冊自定義加載器 */ public function registerAutoloaders() { $loader = new Loader(); $loader->registerNamespaces( array( 'Multiple\Backend\Controllers' => '../apps/backend/controllers/', 'Multiple\Backend\Models' => '../apps/backend/models/', ) ); $loader->register(); } /** * 注冊自定義服務(wù) */ public function registerServices(DiInterface $di) { // Registering a dispatcher $di->set('dispatcher', function () { $dispatcher = new Dispatcher(); $dispatcher->setDefaultNamespace("Multiple\Backend\Controllers"); return $dispatcher; }); // Registering the view component $di->set('view', function () { $view = new View(); $view->setViewsDir('../apps/backend/views/'); return $view; }); } }
還需要一個(gè)指定的啟動文件來加載多模塊的MVC架構(gòu):
<?php use Phalcon\Mvc\Router; use Phalcon\Mvc\Application; use Phalcon\Di\FactoryDefault; $di = new FactoryDefault(); // 自定義路由 // More information how to set the router up https://docs.phalconphp.com/zh/latest/reference/routing.html $di->set('router', function () { $router = new Router(); $router->setDefaultModule("frontend"); $router->add( "/login", array( 'module' => 'backend', 'controller' => 'login', 'action' => 'index' ) ); $router->add( "/admin/products/:action", array( 'module' => 'backend', 'controller' => 'products', 'action' => 1 ) ); $router->add( "/products/:action", array( 'controller' => 'products', 'action' => 1 ) ); return $router; }); try { // 創(chuàng)建應(yīng)用 $application = new Application($di); // 注冊模塊,包含設(shè)置模塊定義類加載位置 $application->registerModules( array( 'frontend' => array( 'className' => 'Multiple\Frontend\Module', 'path' => '../apps/frontend/Module.php', ), 'backend' => array( 'className' => 'Multiple\Backend\BackendModule', 'path' => '../apps/backend/Module.php', ) ) ); // 處理請求 echo $application->handle()->getContent(); } catch (\Exception $e) { echo $e->getMessage(); }
你也可以直接實(shí)例化模塊定義類,類進(jìn)行注冊:
<?php require('../apps/backend/Module.php'); require('../apps/frontend/Module.php'); // 注冊模塊 $application->registerModules( array( 'frontend' => new FrontendModule, 'backend' => new BackendModule ) );
如果你想在啟動文件進(jìn)行相關(guān)組件配置,你可以使用匿名函數(shù)來注冊對應(yīng)的模塊:
<?php use Phalcon\Mvc\View; // 創(chuàng)建視圖組件 $view = new View(); // 設(shè)置視圖組件相關(guān)選項(xiàng) // ... // Register the installed modules $application->registerModules( array( 'frontend' => function ($di) use ($view) { $di->setShared('view', function () use ($view) { $view->setViewsDir('../apps/frontend/views/'); return $view; }); }, 'backend' => function ($di) use ($view) { $di->setShared('view', function () use ($view) { $view->setViewsDir('../apps/backend/views/'); return $view; }); } ) );
當(dāng) Phalcon\Mvc\Application 有多個(gè)模塊注冊時(shí),通常 每個(gè)都是需要的,以便每一個(gè)被匹配到的路由都能返回一個(gè)有效的模塊。每個(gè)已經(jīng)注冊的模塊都有一個(gè)相關(guān)的類來提供建立和啟動自身的函數(shù)。 而每個(gè)模塊定義的類都必須實(shí)現(xiàn)registerAutoloaders()和registerServices()這兩個(gè)方法,這兩個(gè)函數(shù)會在模塊即被執(zhí)行時(shí)被 Phalcon\Mvc\Application 調(diào)用。
更多建議: