2014-02-18 86 views
0

我正在使用很棒的PhalconPHP Framework。我有不同的用戶級別,並加載正確的控制器,我在dispacher類中使用命名空間。我可以在PhalconPHP中使用多個命名空間嗎?

$di->set('dispatcher', function() { 

    //Create an EventsManager 
    $eventsManager = new EventsManager(); 

    //Remove extension before dispatch 
    $eventsManager->attach("dispatch:beforeDispatchLoop", function($event, $dispatcher) { 
     switch($user->getUserType()) { 
      case 1: 
       //Student 
       $dispatcher->setNamespaceName('student'); 
       break; 
      case 2: 
        //Userlevel 2, yet to come 
        break; 
      case 3: 
       //Admin &| Minion 
       $dispatcher->setNamespaceName('admin'); 
    } 
    }); 

    $dispatcher = new MvcDispatcher(); 
    $dispatcher->setEventsManager($eventsManager); 

    return $dispatcher; 
}); 

的命名空間registerd像這樣:

$loader->registerNamespaces(
    array( 
     'Student' => __DIR__ . '/../../app/controllers/student', 
     'Admin' => __DIR__ . '/../../app/controllers/admin, 
) 

);

這很好,但現在我也想要子目錄,比如「..controllers/admin/sub」。 「/ sub」中的控制器也必須位於「admin」命名空間中。 (因爲調度員)或者我可以以某種方式做類似命名空間Admin/*和PHP包括所有子目錄?

我希望我能解釋我的問題,有人可以幫忙。 =)

回答

1

恕我直言,這樣做的更好的方法是在路由器的邏輯域 - 你的調度員派遣的東西被告知派遣,你的路由器找出要派遣什麼,並告訴調度員。你在兩者之間混合。我會擴展路由器,覆蓋句柄方法並從那裏設置命名空間。路由器需要註冊DI(否則將使用基礎路由器)。

public function handle($uri = null) 
{ 
    parent::handle($uri); 

    switch($user->getUserType()) { 
     case 1: 
      //Student 
      $this->_namespace = 'student'; 
      break; 
     case 2: 
       //Userlevel 2, yet to come 
       break; 
     case 3: 
      //Admin &| Minion 
      $this->_namespace = 'admin'; 
      break; 
    } 
} 

對於實際問題 - 它也與您的路由應該工作的方式有關。您需要指定sub namespaces in your routes,或者您也可以在句柄函數中執行它,如下所示。我測試過它,它的工作原理,但在路線中指定它是將相關邏輯保存在一個地方的更好方法。

public function handle($uri = null) 
{ 
    $this->_controller = 'sub\\' . $this->_controller; 
} 

編輯:此外,可能不是你想要什麼,聽到的,但有你的控制器子文件夾可能不是前進的最佳途徑。我不知道是否有最佳做法,但它似乎事實上保持它們在每個模塊/應用程序的一個目錄中。您可以擁有多個模塊和自己的控制器,Phalcon支持多模塊。

相關問題