Волшебный метод YII для управления всеми действиями под контроллером
-
28-10-2019 - |
Вопрос
Коммандос нужна помощь от вас.
У меня есть контроллер в YII:
class PageController extends Controller {
public function actionSOMETHING_MAGIC($pagename) {
// Commando will to rendering,etc from here
}
}
Мне нужен какой -то магический метод под YII CController для управления всем подвесами под /page || Контроллер страницы.
Это как -то возможно с YII?
Спасибо!
Решение
Конечно есть. Самый простой способ - переопределить missingAction
метод
Вот реализация по умолчанию:
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)));
}
Вы можете просто заменить его, например,
public function missingAction($actionID)
{
echo 'You are trying to execute action: '.$actionID;
}
В вышеизложенном, $actionID
это то, что вы называете как $pageName
.
Немного более вовлеченным, но также и более мощным подходом - это переопределить createAction
метод вместо. Вот реализация по умолчанию:
/**
* 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;
}
}
Здесь, например, вы можете сделать что-то столь же жесткое, как
public function createAction($actionID)
{
return new CInlineAction($this, 'commonHandler');
}
public function commonHandler()
{
// This, and only this, will now be called for *all* pages
}
Или вы можете сделать что -то более сложное, в соответствии с вашими требованиями.
Другие советы
Вы имеете в виду Ccontroller или Controller (последний - ваш расширенный класс)? Если вы расширили класс CController, как это:
class Controller extends CController {
public function beforeAction($pagename) {
//doSomeMagicBeforeEveryPageRequest();
}
}
Вы можете получить то, что вам нужно