MVC: контроллер берет на себя слишком много

Sync

Новичок
MVC: контроллер берет на себя слишком много

В своей CMS контроллер, подобно контролеру Seagull Framework делает все необходимое для инициализации модуля, т.е. создает экземпляр его класса, вытаскивает настройки модуля, вызывает его методы и тд.

Это удобно когда модулями генерить основную часть контента, а-ля {$body}.
Но вот столкнулся с проблемой: часто надо выводить что-то на панель, например, несколько новостей, несколько позиций каталога, статистику форума и тд.

Получается нужно где-то писать еще и такое:

$news = new News();
$list_news = $news->list();
.....

Но ведь модуль заточен так, что он ожидает от контроллера настроек и прочей фигни, да и система вывода, в данном случае это Smarty, инкапсулирована в одном из методов контроллера, то есть надо эту $list_news еще как-то и заэссайгнить.

Теперь думаю часть работы контроллера переносить в класс
Module, от которого наследуются все модули.

Что можете подсказать по этому поводу? В чем заключается моя правота/неправота?

Спасибо!
 

_RVK_

Новичок
Подобная тема уже была. Но я писал в неё с чисто теоритической стороны. Сейчас реализовал все на практике.

Как сделано у меня. Есть MainController или диспечер. Он final. Файл index.php выглядит так:
PHP:
<?php
include_once '../config/global.cnf.php';
include_once '../config/db.cnf.php';

$controller = MainController::getInstance();
$controller->exec();

print $controller->getView();
?>
в урле передается имя текущего модуля и имя действия. По этим данным ищется класс типа BaseAction или SuperAction и у него вызывается метод exec();

Вот типичный SuperAction:
PHP:
<?php
class UsersUserListAction extends SuperAction {
    
    public $protected = true;

    function BeforeExec() {
        $this->execAction(new MainMenuAction());
    }

    function exec() {
        
        $users = new Users();
        $users->OrderBy(Enviroment::Get('order','login'), Enviroment::Get('direct','ASC'));
        $users->FindAll();
        
        $this->addModel($users);
   }
}
?>
Заметьте в методе BeforeExec() вызывается другой Action.

Таким образом в конечный шаблон передается масив вида:

PHP:
[UsersUserList] => Array
        (
            [MainMenu] => Array
                (
                    
                     //Тут данные меню, дерево пунктов, иконки и тп....
                    [__ACCESS_DENIED__] => 
                )

            [Users] => Array
                (
                    [1] => Array
                        (
                            [id] => 1
                            [login] => 
                            [pass] => 
                            [email] => 
                            [active] => 1
                        )

                    [2] => Array
                        (
                            [id] => 2
                            [login] => tyu
                            [pass] => 
                            [email] => [email protected]
                           [active] => 1
                        )

                )

            [__ACCESS_DENIED__] => 
        )
Таким образом я в результирующем шаблоне получаю данные из нескольких моделей и показываю их.
 

Necromant

Новичок
А может, пора все таки отойти , от модели . когда все нужные данные выплевываются в шаблон и перейти , к когда шаблон , требует , то что ему нужно ???
 

_RVK_

Новичок
Автор оригинала: Necromant
А может, пора все таки отойти , от модели . когда все нужные данные выплевываются в шаблон и перейти , к когда шаблон , требует , то что ему нужно ???
Подробнее, плиз. Я слабо себе представляю как шаблон может "требовать". Может ты имел ввиду "представление"
 

Sync

Новичок
По этим данным ищется класс типа BaseAction или SuperAction и у него вызывается метод exec();
А в чем отличие BaseAction и SuperAction ?

То есть насколько я понял, чтобы что-то вывести/спрятать/изменить нужно лезть в SuperAction модуля?

Кстати, эти производные от SuperAction храняться в файле движка модуля?

-~{}~ 12.10.05 14:22:

Автор оригинала: Necromant
А может, пора все таки отойти , от модели . когда все нужные данные выплевываются в шаблон и перейти , к когда шаблон , требует , то что ему нужно ???
Хочеться сделать шаблоны понятными хотя-бы для верстальщика/дизайнера, с активными шаблонами у них туго, к сожалению....
 

_RVK_

Новичок
А в чем отличие BaseAction и SuperAction
Разница только в том что BaseAction не имеет метода execAction() и некоторых свойств. Тоесть он не умеет выполнять другие экшены.

То есть насколько я понял, чтобы что-то вывести/спрятать/изменить нужно лезть в SuperAction модуля
В один из. Их у модуля может быть много.
Кстати, эти производные от SuperAction храняться в файле движка модуля
На каждый акшин один файл. Они все находятся в директории для этого предназначенной.

-~{}~ 12.10.05 14:26:

тобы что-то вывести/спрятать/изменить нужно лезть в SuperAction модуля
Не совесем. В этом то и смысл. Ты можешь вкладывать экшены друг в друга. Те есть экшин для вывода списка новостей не меняется. Ты просто помещаешь его в другой SuperAction и в нем уже задаешь логику.
 

Necromant

Новичок
Пример: Требуется, построить дом .
Есть стройплощадка , и эскиз.
А теперь, а вот теперь мы смотрим на эскиз дома , и говорим,
А постройка ты мне стену. -> Стена строится.
А постройка ты мне стену. -> смотрим ескиз стены , там есть окно, и говрим .
... А постройка ты мне окно -> смотрим еслиз окна -> ничего делать не надо -> достраиваем стену.
 

Necromant

Новичок
эскиз , знает , о свое й области компетентности ...
эскиз стены знает как ее себя построить ...
эскиз окна знает . как себя построить , и что на окне непременно должна сидеть кошка ...
 

Sync

Новичок
Автор оригинала: _RVK_
В один из. Их у модуля может быть много.
Сорри, не заметил <?php ?> :)

Не совесем. В этом то и смысл. Ты можешь вкладывать экшены друг в друга. Те есть экшин для вывода списка новостей не меняется. Ты просто помещаешь его в другой SuperAction и в нем уже задаешь логику.
Понял тебя.

Для каждой страницы я на контроллер должен подать массив акшинов, что-то типа
PHP:
Array
(
    [body] => Array
        (
            [0] => $_GET['action']
        )

    [left_panel] => Array
        (
            [0] => news_list
            [1] => catalog_list
            [2] => voting
        )

    [right_panel] => Array
        (
            [0] => catalog_list
        )

)
которые например, сохранены в базе и потом вызывать эти SuperAction.

так?
 

_RVK_

Новичок
Это строитель знает. Из искиза. НО спорить не буду. То что ты предлагаешь действительно отличается от того что у меня. Это разные подходы.
 

Necromant

Новичок
Просто , понимаешь , я в конечном счете , не знаю, что у мя получится. воовсе, пока не раскрутится весь стек ескизов.
 

_RVK_

Новичок
Нет, не так.

Ты вызывешь контроллер. ../index.php?module=News&action=View

MainController ищет класс с именем NewsViewAction и выполняет его. Потом забирает данные и отдает в шаблон.
НО NewsViewAction на самом деле Superaction. В нем могут выполняться и другие акшены. Но MainController об этом не занет. Его задача получить данные и отдать их представлению.

-~{}~ 12.10.05 14:54:

Вот почитай еще по теме.

http://phpclub.ru/talk/search.php?s=&action=showresults&searchid=804161&sortby=lastpost&sortorder=descending
 

Necromant

Новичок
Цепочка , таких вызовов, глухой угол. Т.к. в шаблону нужно ВСЕ об преставленпии того, что он отображает.
 

syfisher

TDD infected!!
ИМНО, это очень нерачительно привязывать контроллер к структуре визуальной части (даже к данным). Это должны делать или View-helper-ы в случае с Push-View (данные передаются в шаблон - чаще всего при применении Smarty) или же шаблон должен иметь возможность делать большинство запросов вида "Правое меню", "Список активных юзеров" самостоятельно - в случае с Pull-View.

Контроллер должен делать только, что связано с модификацией модели и процессингом действий пользователя.

Остальное - обычно передается в так называемые View классы, которые уже работают с конкретными шаблонами. Контроллер обычно только указывает, какой View должен использоваться и все.
 

_RVK_

Новичок
syfisher

Все это не исключает того что писал я. Данные в шаблон передает MainController. А кому он их будет передавать, другим View или напрямую в шаблон это дело десятое. У меня пока реализованно так.
 
Сверху