2011-01-05 2 views
3

cadre Yii supporte les modules et les sous-répertoires aussi dans le répertoire des contrôleurs, afin chemin d'une action spécifique pourrait êtreController instanciation dans le cadre Yii par répertoire et l'espace

  • /index.php?r=module/controller/action ou
  • /index.php?r=subdirectoryInControllerDir/controller/action.

Mon but ici est d'avoir plusieurs sous-répertoires dans le répertoire des contrôleurs. À l'intérieur de ces dossiers je créerais des contrôleurs avec les mêmes noms que les parents utilisant des espaces de noms.

Cependant, si j'écris

namespace mynamespace; 
class MyController extends \MyController { 
} 

Yii chargerait MyController au lieu de mynamespace\MyController;

Toutes les suggestions ici?

+3

Je pense que ce serait mieux demandé dans Stack Overflow. Si c'est le cas, je peux retourner la prime et migrer la question. Faites-moi savoir si vous êtes d'accord. – ChrisF

+0

Cela ressemble à SO matériel en effet. –

+0

Pas de soucis, allez-y! – ozz

Répondre

1

Yii utilise une convention de dénomination intuitive pour les espaces de noms, qui commence à partir de \ application et doit suivre la structure du répertoire physique, comme la configuration de chargement automatique intégrée. Si votre classe MyController de base est protégée/contrôleurs /, il doit utiliser namespace application\controllers;

<?php 
namespace application\controllers; 
class MyController extends \CController 
{ 
    // actions 
} 

et le MyController des enfants dans la protection/contrôleurs/subdir/

<?php 
namespace application\controllers\subdir; 
class MyController extends \application\controllers\MyController 
{ 
    // actions 
} 

Pour faire une demande comme « subdir/mon » travail, vous devez ajouter le code suivant à CWebApplication::createController() (ou hériter dans une sous-classe) juste après le fichier de classe est inclus:

if(!class_exists($className,false)) 
     require($classFile); 
+ if(!class_exists($className,false)) 
+  $className = '\\application\\controllers\\' . str_replace('/', '\\', $controllerID . $className); 
    if(class_exists($className,false) && is_subclass_of($className,'CController')) 
    { 
     $id[0]=strtolower($id[0]); 
     return array(
      new $className($controllerID.$id,$owner===$this?null:$owner), 
      $this->parseActionParams($route), 
     ); 
    } 

Si vous avez défini controllerNameSpace de CWebApplication, vous pouvez également utiliser cette valeur au lieu du codage en dur \\application\\controllers\\.