Phalcon7 多模块应用
多模块的应用使用了相同的文档根目录但拥有多个模块。在这种情况下,可以使用以下的文件目录结构:
multiple/ apps/ frontend/ controllers/ models/ views/ Module.php backend/ controllers/ models/ views/ Module.php public/ css/ img/ js/
模块定义类(Module Define Class)¶
在`apps/下的每一个目录都有自己的 MVC 结构。`Module.php 文件定义了各个模块不同的配置,如自动加载器、视图和自定义服务:
<?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(); } /** * 注册自定义服务 */ 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; }); } }
还需要一个指定的启动文件来加载多模块的MVC架构:
<?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 { // 创建应用 $application = new Application($di); // 注册模块,包含设置模块定义类加载位置 $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(); }
你也可以直接实例化模块定义类,类进行注册:
<?php require('../apps/backend/Module.php'); require('../apps/frontend/Module.php'); // 注册模块 $application->registerModules( array( 'frontend' => new FrontendModule, 'backend' => new BackendModule ) );
如果你想在启动文件进行相关组件配置,你可以使用匿名函数来注册对应的模块:
<?php use Phalcon\Mvc\View; // 创建视图组件 $view = new View(); // 设置视图组件相关选项 // ... // 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; }); } ) );
当 Phalcon\Mvc\Application 有多个模块注册时,通常 每个都是需要的,以便每一个被匹配到的路由都能返回一个有效的模块。每个已经注册的模块都有一个相关的类来提供建立和启动自身的函数。 而每个模块定义的类都必须实现registerAutoloaders()和registerServices()这两个方法,这两个函数会在模块即被执行时被 Phalcon\Mvc\Application 调用。