MVC Applications ================ 在 Phalcon ä¸ï¼Œæ‰€æœ‰å¤æ‚çš„MVC相关工作都是由 :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` æ¥å®Œæˆçš„。该组件å°è£…äº†æ‰€æœ‰å¤æ‚çš„åŽå°æ“作,包括æ¯ä¸€ä¸ªç»„件的实例化,组件之间的集æˆç‰ã€‚ Single or Multi Module Applications ----------------------------------- 使用æ¤ç»„件,您å¯ä»¥è¿è¡Œä¸åŒç±»åž‹çš„MVC结构: Single Module ^^^^^^^^^^^^^ å•MVC应用程åºåªåŒ…å«ä¸€ä¸ªmodule,å¯ä»¥ä½¿ç”¨å‘½åç©ºé—´ï¼Œä½†ä¸æ˜¯å¿…éœ€çš„ã€‚è¿™æ ·çš„åº”ç”¨ç¨‹åºçš„æ–‡ä»¶ç»“构如下: .. code-block:: php single/ app/ controllers/ models/ views/ public/ css/ img/ js/ 如果ä¸ä½¿ç”¨å‘½å空间,引导文件被用æ¥åè°ƒMVCæµç¨‹ï¼š .. code-block:: php <?php $loader = new \Phalcon\Loader(); $loader->registerDirs( array( '../apps/controllers/', '../apps/models/' ) )->register(); $di = new \Phalcon\DI\FactoryDefault(); // Registering the view component $di->set('view', function() { $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../apps/views/'); return $view; }); try { $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(Phalcon\Exception $e) { echo $e->getMessage(); } 如果使用命å空间,引导文件å¯ä»¥è¿™æ ·åšï¼š .. code-block:: php <?php $loader = new \Phalcon\Loader(); // Use autoloading with namespaces prefixes $loader->registerNamespaces( array( 'Single\Controllers' => '../apps/controllers/', 'Single\Models' => '../apps/models/', ) )->register(); $di = new \Phalcon\DI\FactoryDefault(); // Register the dispatcher setting a Namespace for controllers // Pay special attention to the double slashes at the end of the // parameter used in the setDefaultNamespace function $di->set('dispatcher', function() { $dispatcher = new \Phalcon\Mvc\Dispatcher(); $dispatcher->setDefaultNamespace('Single\Controllers\\'); return $dispatcher; }); // Registering the view component $di->set('view', function() { $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../apps/views/'); return $view; }); try { $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(Phalcon\Exception $e){ echo $e->getMessage(); } Multi Module ^^^^^^^^^^^^ 一个multi-module(多模å—)çš„åº”ç”¨ç¨‹åºæ˜¯æŒ‡ä½¿ç”¨ç›¸åŒçš„Document Root,但有超过一个moduleã€‚åœ¨è¿™ç§æƒ…况下,程åºçš„æ–‡ä»¶ç»“构如下: .. code-block:: php multiple/ apps/ frontend/ controllers/ models/ views/ Module.php backend/ controllers/ models/ views/ Module.php public/ css/ img/ js/ 在 apps/ 目录下的æ¯ä¸ªç›®å½•都有自己的MVC结构,Module.php是æ¯ä¸ªModule特定的设置: .. code-block:: php <?php namespace Multiple\Backend; use Phalcon\Mvc\ModuleDefinitionInterface; class Module implements ModuleDefinitionInterface { /** * Register a specific autoloader for the module */ public function registerAutoloaders() { $loader = new \Phalcon\Loader(); $loader->registerNamespaces( array( 'Multiple\Backend\Controllers' => '../apps/backend/controllers/', 'Multiple\Backend\Models' => '../apps/backend/models/', ) ); $loader->register(); } /** * Register specific services for the module */ public function registerServices($di) { //Registering a dispatcher $di->set('dispatcher', function() { $dispatcher = new \Phalcon\Mvc\Dispatcher(); $dispatcher->setDefaultNamespace("Multiple\Backend\Controllers\\"); return $dispatcher; }); //Registering the view component $di->set('view', function() { $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../apps/backend/views/'); return $view; }); } } 一个特殊的引导文件,用以载入 multi-module MVC 结构: .. code-block:: php <?php $di = new \Phalcon\DI\FactoryDefault(); //Specify routes for modules $di->set('router', function () { $router = new \Phalcon\Mvc\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 { //Create an application $application = new \Phalcon\Mvc\Application(); $application->setDI($di); // Register the installed modules $application->registerModules( array( 'frontend' => array( 'className' => 'Multiple\Frontend\Module', 'path' => '../apps/frontend/Module.php', ), 'backend' => array( 'className' => 'Multiple\Backend\Module', 'path' => '../apps/backend/Module.php', ) ) ); //Handle the request echo $application->handle()->getContent(); } catch(Phalcon\Exception $e){ echo $e->getMessage(); } å¦‚æžœä½ æƒ³æŠŠé…ç½®æ–‡ä»¶å®Œå…¨å†™å…¥åˆ°å¼•å¯¼æ–‡ä»¶ï¼Œä½ å¯ä»¥ä½¿ç”¨ä¸€ä¸ªåŒ¿åå‡½æ•°çš„æ–¹å¼æ¥æ³¨å†Œ Module : .. code-block:: php <?php //Creating a view component $view = new \Phalcon\Mvc\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/frontend/views/'); return $view; }); } ) ); 当 :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` Module注册åŽï¼Œæ¯ä¸ªåŒ¹é…çš„route都必须返回一个有效的module。注册的module都有一个相关的类,用于设置module本身æä¾›çš„功能。æ¯ä¸ªmodule类都必须实现 registerAutoloaders() å’Œ registerServices() 这两个方法,:doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` å°†è°ƒç”¨å®ƒä»¬æ‰§è¡Œè¦æ‰§è¡Œçš„module。 了解默认行为 ---------------------------------- å¦‚æžœä½ ä¸€ç›´å…³æ³¨ :doc:`tutorial <tutorial>` 或 使用 :doc:`Phalcon Devtools <tools>` 生æˆè¿‡ä»£ç ï¼Œä½ å¯èƒ½ä¼šç†Ÿæ‚‰ä»¥ä¸‹çš„引导文件: .. code-block:: php <?php try { // Register autoloaders //... // Register services //... // Handle the request $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch (\Phalcon\Exception $e) { echo "PhalconException: ", $e->getMessage(); } æ‰€æœ‰æŽ§åˆ¶å™¨å·¥ä½œçš„æ ¸å¿ƒæ˜¯ handle()方法被调用: .. code-block:: php <?php echo $application->handle()->getContent(); 如果您ä¸å¸Œæœ›ä½¿ç”¨ :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` ,上é¢çš„代ç å¯ä»¥ä¿®æ”¹å¦‚下: .. code-block:: php <?php // Request the services from the services container $router = $di->get('router'); $router->handle(); $view = $di->getShared('view'); $dispatcher = $di->get('dispatcher'); // Pass the proccessed router parameters to the dispatcher $dispatcher->setControllerName($router->getControllerName()); $dispatcher->setActionName($router->getActionName()); $dispatcher->setParams($router->getParams()); // Start the view $view->start(); // Dispatch the request $dispatcher->dispatch(); // Render the related views $view->render( $dispatcher->getControllerName(), $dispatcher->getActionName(), $dispatcher->getParams() ); // Finish the view $view->finish(); $response = $di->get('response'); // Pass the output of the view to the response $response->setContent($view->getContent()); // Send the request headers $response->sendHeaders(); // Print the response echo $response->getContent(); 尽管上é¢çš„ä»£ç æ˜¾å¾—比使用 :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` 罗唆,但它æä¾›äº†ä¸€ç§æ›¿ä»£bootstrap文件的方å¼ã€‚æ ¹æ®ä½ 的需è¦ï¼Œä½ å¯èƒ½å¸Œæœ›å®Œå…¨æŽŒæ¡å“ªäº›ç±»åº”è¯¥è¢«å®žä¾‹åŒ–ï¼Œæˆ–ä½¿ç”¨è‡ªå·±çš„ç»„ä»¶æ¥æ‰©å±•默认的功能。 Application Events ------------------ :doc:`Phalcon\\Mvc\\Application <../api/Phalcon_Mvc_Application>` 能够将事件å‘é€åˆ° :doc:`EventsManager <events>`,事件管ç†å™¨é€šè¿‡è§¦å‘ "application"æ¥å®žçŽ°ï¼Œæ”¯æŒä»¥ä¸‹çš„事件: +---------------------+--------------------------------------------------------------+ | Event Name | Triggered | +=====================+==============================================================+ | beforeStartModule | Before initialize a module, only when modules are registered | +---------------------+--------------------------------------------------------------+ | afterStartModule | After initialize a module, only when modules are registered | +---------------------+--------------------------------------------------------------+ | beforeHandleRequest | Before execute the dispatch loop | +---------------------+--------------------------------------------------------------+ | afterHandleRequest | After execute the dispatch loop | +---------------------+--------------------------------------------------------------+ 下é¢çš„示例演示如何在æ¤ç»„ä»¶ä¸Šæ·»åŠ ç›‘å¬å™¨ï¼š .. code-block:: php <?php $eventsManager = new Phalcon\Events\Manager(); $application->setEventsManager($eventsManager); $eventsManager->attach( "application", function($event, $application) { // ... } ); ç›¸å…³èµ„æº ------------------ * `MVC examples on Github <https://github.com/phalcon/mvc>`_