2011-06-14 26 views
13

Comando necesita ayuda de usted.Método mágico de Yii para controlar todas las acciones bajo un controlador

que tienen un controlador de Yii:

class PageController extends Controller { 
    public function actionSOMETHING_MAGIC($pagename) { 
     // Commando will to rendering,etc from here 
    } 
} 

Necesito algún método mágico bajo Yii CController para controlar todo subpetición bajo/página || Controlador de página.

¿Esto de alguna manera es posible con Yii?

Gracias!

Respuesta

19

Seguro que hay. La forma más fácil es anular el método missingAction.

Aquí es la aplicación por defecto:

public function missingAction($actionID) 
{ 
    throw new CHttpException(404,Yii::t('yii','The system is unable to find the requested action "{action}".', 
     array('{action}'=>$actionID==''?$this->defaultAction:$actionID))); 
} 

simplemente podría sustituirlo por ejemplo,

public function missingAction($actionID) 
{ 
    echo 'You are trying to execute action: '.$actionID; 
} 

En lo anterior, $actionID es lo que ustedes se refieren como $pageName.

Un enfoque un poco más complicado pero también más poderoso sería reemplazar el método createAction en su lugar. Aquí está la implementación por defecto:

/** 
* Creates the action instance based on the action name. 
* The action can be either an inline action or an object. 
* The latter is created by looking up the action map specified in {@link actions}. 
* @param string $actionID ID of the action. If empty, the {@link defaultAction default action} will be used. 
* @return CAction the action instance, null if the action does not exist. 
* @see actions 
*/ 
public function createAction($actionID) 
{ 
    if($actionID==='') 
     $actionID=$this->defaultAction; 
    if(method_exists($this,'action'.$actionID) && strcasecmp($actionID,'s')) // we have actions method 
     return new CInlineAction($this,$actionID); 
    else 
    { 
     $action=$this->createActionFromMap($this->actions(),$actionID,$actionID); 
     if($action!==null && !method_exists($action,'run')) 
       throw new CException(Yii::t('yii', 'Action class {class} must implement the "run" method.', array('{class}'=>get_class($action)))); 
     return $action; 
    } 
} 

aquí, por ejemplo, se podría hacer algo como de mano dura como

public function createAction($actionID) 
{ 
    return new CInlineAction($this, 'commonHandler'); 
} 

public function commonHandler() 
{ 
    // This, and only this, will now be called for *all* pages 
} 

o usted podría hacer algo más elaborado, de acuerdo con sus necesidades.

10

¿Quiere decir CController o Controlador (la última es su clase extendida)? Si extendió clase CController así:

class Controller extends CController { 
    public function beforeAction($pagename) { 

    //doSomeMagicBeforeEveryPageRequest(); 

    } 
} 

que podría obtener lo que necesita

Cuestiones relacionadas