forked from phalcon/cphalcon
-
Notifications
You must be signed in to change notification settings - Fork 0
Multi Module
phalcon edited this page Aug 7, 2012
·
6 revisions
Here's the Multi-Module applications proposal.
Let's pretend we have a directory structure like this:
apps/
default/
config/
controllers/
models/
views/
Module.php
backend/
config/
controllers/
models/
views/
Module.php
frontend/
config/
controllers/
models/
views/
Module.php
public/
js/
css/
index.php
There are a directory called "apps" which contains applications or modules. Each of them have the usual MVC directories. The Module.php file contains a Module definition, for instance:
apps/backend/Module.php:
<?php
namespace Store\Backend;
use Phalcon\Mvc\ModuleDefinition;
use Phalcon\Loader as Loader;
use Phalcon\Config\Adapter\Ini as Config;
//a module implements the ModuleDefinition interface, ensuring that registerAutoloaders and getConfig are implemented
class Module implements ModuleDefinition {
//This method register autoloaders for MVC locations and other user stuff
public function registerAutoloaders(){
$loader = new Loader();
$loader->registerNamespaces(array(
'Store\Backend\Controllers' => 'apps/backend/controllers/'
'Store\Backend\Models' => 'apps/backend/models/'
));
$loader->register();
}
//This method returns the configuration object for this module
public function getConfig(){
return new Config('app/config/config.ini');
}
}
Now the bootstrap, the idea is introduce a new component Phalcon\Mvc\Orchestrator, which allows to register module definitions, a router will indicate which module/controller/action should be executed:
public/index.php
add("/admin/products/:action", array( 'module' => 'backend', 'controller' => 'Store\Backend\Controllers\Products', 'action' => 1 )); $router->add("/welcome", array( 'module' => 'default', 'controller' => 'Store\Default\Controllers\Index', 'action' => 'index' )); //this class orchestrate the entire MVC flow $orchestrator = new MvcOrchestrator(); //set the router $orchestrator->setRouter($router); //register the modules and their definitions $orchestrator->registerModules(array( 'default' => '../apps/default/Module.php', 'backend' => '../apps/backend/Module.php', 'frontend' => '../apps/frontend/Module.php' )) $orchestrator->handle(); } catch(Phalcon\Exception $e){ echo $e->getMessage(); } A controller would look like this: apps/backend/controllers/ProductsController.php