Пример 1.
Допустим есть у меня два контроллера PostController и CommentController
и есть некий код, который обрабатывает действие предпросмотра комментария, что-то вроде:
Код: Выделить всё
public function handlePreview($comment)
{
if(empty($_POST['preview']))
return '';
$preview='';
$comment->scenario='preview';
if($comment->validated('preview')){
$preview=$this->renderPartial('/comment/preview',array(
'model'=>$comment
),true);
}
if(Yii::app()->request->isAjaxRequest){
echo $this->processOutput($preview);
Yii::app()->end();
}
return $preview;
}
Пример 2.
Есть опять же эти два контроллера и действия post/view, post/delete и comment/create
Все три действия юзают один момент для проверки существования поста в таблице:
Код: Выделить всё
public function loadPost($id)
{
$model=Post::model()->findByPk($id);
if(!isset($model))
throw new CHttpException(404);
}
return $model;
1) Использовать базовый контроллер, но если методов типа loadPost очень много (много вложенных уровней связей таблиц, например Site->Catalog->Region->Bouquet->BouquetComponent), то базовый контроллер просто раздувается.
2) Использовать поведение - то же что и пред. пункт + падение производительности.
3) Использовать статический метод у PostController - public static function loadPost($id) и уже к нему обращаться из других контроллеров, при необходимости.
Если кто может аргументировать какой из способов лучше или предложит свой, то буду очень рад выслушать.
P.S.: все примеры из реальных проектов, так что вопрос не только теоретический, но и практический.