2014-10-27 88 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(); 
相關問題