2014-10-27 43 views

回答

2

一些php框架在路由之前注册所有模块。例如,Zend Framework将遍历每个注册模块并加载其引导信息。然后它将解析路线并执行目标控制器。好处是您可以在模块之间进行分层mvc调用。缺点是如果你不打算对所有这些你自举的模块做任何事情,你会有很多开销。

为了简化引导程序并加快载入速度,Phalcon框架在载入注册模块中的任何文件之前确定路径。它不会在每个模块中加载module.php文件,而只是加载位于将要执行的路径路径中的module.php文件。这里的好处是速度。缺点是试图跨模块执行分层mvc。此时,phalcon只引导了路由模块,因此不可知其他模块。

实质上,这意味着您只能在当前模块中执行hmvc请求。同样,phalcon中的调度程序只能重定向到同一模块中的控制器和操作。如果您需要转到其他模块,则可以使用响应 - >重定向操作执行301重定向。当然,这会产生一个全新的http请求,所以不适合hmvc模式。

扩展此功能的一种方法是注册一组位于模块外部的通用名称空间。在最初的启动顺序从index.php文件开始,你可以加载这些命名空间:

$loader = new \Phalcon\Loader(); 
$loader->registerNamespaces(
    array(
     'Common\Controllers'  => COMMON_PATH . '/controllers/' , 
     'Common\Forms'    => COMMON_PATH . '/forms/' , 
     'Common\Models'    => COMMON_PATH . '/models/' , 
     'Common\Models\ViewHelpers' => COMMON_PATH . '/models/ViewHelpers/' , 
     'Common\Plugins'   => COMMON_PATH . '/plugins/' , 
    ) 
); 
// each module will register its own namespace separately 
$loader->register(); 
return $loader; 

在每个模块中的Module.php引导文件,将添加额外的命名空间为您的特定的模块:

/** 
* Register a specific autoloader for the module 
*/ 
public function registerAutoloaders(){ 
    $loader = new \Phalcon\Loader(); 
    $loader->registerNamespaces(
     array(
      $this->_module_name . '\Controllers' => __DIR__ . '/controllers/' , 
      $this->_module_name . '\Models'  => __DIR__ . '/models/' , 
      $this->_module_name . '\Forms'  => __DIR__ . '/forms/' , 
     ) 
    ); 
    $loader->register(); 
} 

现在你有命名空间访问调用在共同命名空间的类以及命名空间访问类在当前模块的名称空间:

$common_model = new \Common\Models\MyModel(); 
$module_model = new \CurrentModuleName\Models\MyModel(); 
相关问题