1 контроллер == 1 логическая страница сайта?

Духовность™

Продвинутый новичок
1 контроллер == 1 логическая страница сайта?

Фаулер писал вот о том, что на каждый клик мыши должен быть свой контроллер. Т.е на каждый запрос должен быть свой программный код. Отсюда возникает вопрос, а верно ли утверждение, что каждый контроллер представляет собой фактически обработчик для ОДНОЙ логической страницы сайта? Т.е. может ли контролер быть универсальным для двух разных страниц приложения?

Я почему спрашиваю. У меня есть вот такой контроллер для admin-части сайта, вызывается по адресу /admin/user/delete/?id=5

PHP:
<?php
class BackendUserDeleteController extends BackendUserCommonController
{
    public function run()
    {
        parent::run();

        if (!isset($this->request->getRequest()->id))
        {
            $redirect = new Redirect();
            $redirect->setType('alert');
            $redirect->setMessage('Не определен ID пользователя');
            // переадресуем на /admin/user/main
            $redirect->setRedirectUrl( Redirect::implode($this->getEndAlias(), 
                                                         $this->getModuleAlias(), 'main' ));
            $redirect->run();
        }

        $this->user_mapper->delete($this->user);

        $redirect = new Redirect();
        $redirect->setMessage('Пользователь %user_name% успешно удален');
        $redirect->addParam('user_name', Format::hsc( $this->user->getFullName() ));
        // переадресуем на HTTP_REFERER
        $redirect->setRedirectUrl($this->request->getRequest()->referer);
        $redirect->run();
    }
}
?>
В виду того, что в контроллере указаны специфические пути, по которым делается redirect, я не могу этот контроллер вызывать в каком-то другом контексте, например в контексте удаления пользователей ВНЕ административного интерфейса. Т.е. получилось что 1 контроллер == 1 логической страницы.

Правильно ли это или нет? Или контроллер нужно проектировать так, что бы его можно было вызывать в любом другом месте приложения?
 

whirlwind

TDD infected, paranoid
Делаем реквест через коллекцию, на вывод в шаблонизатор, по середине контроллер который хоть в консоли запускай. Это не зависит от логического разделения, это зависит от уровня абстрагированности от реквест/респонза. Под те-же кроновские задачи почему бы тот же самый сеттинг не использовать, что для обычно страницы? Скормил такому контроллеру пустой реквест и вуаля!
 

С.

Продвинутый новичок
Что за бардак с этим MVC у людей в головах. Не контролер это -- модель.
 

Духовность™

Продвинутый новичок
все равно не понятно. можно с примером?

в каждом контроллере у меня код, специфичной для определенной страницы. в приведенном выше контроллере - пути редиректа, указывающие на /admin/user/main/. они все портят.

-~{}~ 18.02.10 20:01:

Не контролер это -- модель
почему модель? где здесь модель?
 

Fortop

Новичок
пути редиректа, указывающие на /admin/user/main/. они все портят.
Сделай их устанавливаемыеми. Кто мешает?

PHP:
if ($result) {
    $this->redirect($this->getParam('success-redirect-to'));
} else {
    $this->redirect($this->getParam('fail-redirect-to'));
}
 

C_TIGER

Новичок
может, всё может.
зайбейте на фаулера, забейте на мвц и делайте так как будет лучше.
своё мнение надо иметь =)

и вопросы сами собой отпадут
 

whirlwind

TDD infected, paranoid
triumvirat если у тебя набор интерфейсов, то все равно каждый надо как то идентифицировать. Убери инстанцирование Redirect и перенеси стратегию редиректа в контекст выполнения. Таким образом, ты сможешь менять обработчик снаружи.

PS. Вообще твой вопрос по поводу того, что редирект мешает мне не совсем понятен. Я думал ты с проблемами, возникающими при инстанцировании внутри класса уже знаком. Это можно делать для immutable или классов-состояний. Для поведенческих классов (стратегий) этого делать не стоит. Как минимум - фабричный метод.
 

Духовность™

Продвинутый новичок
Сделай их устанавливаемыеми. Кто мешает?
Я о другом. В контроллере прописывается URL адрес куда потом идти. Прописывается не явно, а с помощью этого:

PHP:
$redirect->setRedirectUrl( Redirect::implode($this->getEndAlias(), 
                                                         $this->getModuleAlias(), 'main' ));
Этот URL адрес указывает на admin часть сайта - /admin/user/main/. А я не исключаю ситуации, что данный контроллер можно было бы заюзать и для frontend-части сайта? тогда URL переадресации будет другой, хз какой. Не хочется плодить в контроллере конструкции:

PHP:
if (frontend) $url = '...';
else $url = '...';

$redirect->setRedirectUrl($url);
вот я и спрашиваю..

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

whirlwind

TDD infected, paranoid
ЗЫ. на пальцах у тебя болжно быть не
PHP:
$redirect->run();
а

PHP:
$this->request->getRedirectStrategy()->run($redirect);
как-то так

-~{}~ 18.02.10 20:42:

угу, все больше и больше склоняюсь к тому, что обсуждать идеологию проектирования чрезвычайно вредно.
Фаулер называет это - аналитический паралич. Обсуждать не надо, надо взять и нарисовать самое главное (c) UML Основы.
 

AmdY

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

triumvirat вот, ты нашёл что можно убрать из контроллера, вынеси редирект в отдельный метод, чтобы ифов не городить, сделай его абстрактным и принудь реализовывать интерфейсом. Посмотри как храк с фиксером виьху отвязали от формата.
 

Beavis

Banned
triumvirat
это у тебя action controller ? ну значит в нем может быть несколько action'ов...
во всех MVC-фреймворках вроде подход к контроллерам похожий, например класс NewsController и в нем экшены типа listAction, createAction, editAction и т.д.
 

Духовность™

Продвинутый новичок
во всех MVC-фреймворках вроде подход к контроллерам похожий, например класс NewsController и в нем экшены типа listAction, createAction, editAction и т.д.
нет, я отказался оттакого - каждый класс - контроллер. так удобнее.
 

C_TIGER

Новичок
Фаулер называет это - аналитический паралич.<<<
а я называю это способностью думать своей головой. и говорю что надо взять и семь раз подумать прежде чем рисовать (с)

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

whirlwind

TDD infected, paranoid
C_TIGER Сравнил жопу с пальцем. Кто ты и кто Фаулер?

PS. Достал ты флудом своим уже, если чесно.
 

Beavis

Banned
Автор оригинала: triumvirat
нет, я отказался оттакого - каждый класс - контроллер. так удобнее.
Ты имел ввиду что каждый экшн - класс? точнее что в каждом контроллере только по одному экшену?
А какие в этом удобства?
 

Духовность™

Продвинутый новичок
наверно удобно шарится в папках с сотней файлов
ну начнем с того, что в каждой папке, относящейся к модулям, от силы по 5 файлов. А шариться в многострочном классе с кучей методов - вот это реальное неудобство. Зачем интерпретатор заставлять читать то, что не относится к конкретному запросу?
 

Beavis

Banned
Автор оригинала: triumvirat
Зачем интерпретатор заставлять читать то, что не относится к конкретному запросу?
Ну тут главное без фанатизма подходить к вопросу)
 

crocodile2u

http://vbolshov.org.ru
во всех MVC-фреймворках вроде подход к контроллерам похожий, например класс NewsController и в нем экшены типа listAction, createAction, editAction и т.д.
Не во всех. Например, В Limb (по крайней мере, в той версии, которую я когда-то ковырял) - контроллеры был организованы по шаблону "Команда".

нет, я отказался оттакого - каждый класс - контроллер. так удобнее.
См. выше. Ты реализовал шаблон "Команда".

А вообще, по теме, я согласен с Beavis: "главное без фанатизма подходить к вопросу". Причем это касается не только MVC или данного конкретного примера.

Сделай так, как удобно и как выглядит логично и стройно. А потом отрефактори, убери дублирование, вынеси что-то в родительский класс.

Например, ты говоришь: "я не могу этот контроллер вызывать в каком-то другом контексте, например в контексте удаления пользователей ВНЕ административного интерфейса."

Можно сделать базовую команду DeleteUserCommand, от нее унаследовать DeleteUserCommandFront и DeleteUserCommandBack. Общая функциональность будет в базовом классе, отличающаяся - в потомках (пригодится, возможно, шаблон "Шаблонный метод - Template Method")
 

craz

Нестандартное звание
ну начнем с того, что в каждой папке, относящейся к модулям, от силы по 5 файлов. А шариться в многострочном классе с кучей методов - вот это реальное неудобство. Зачем интерпретатор заставлять читать то, что не относится к конкретному запросу?
про интерпретатор не скажу у него наверное кеш есть?
а про кучу методов - есть же IDE нормальные... c деревом класса
и что быстрее интерпретатору прочитать фал или открыть новый?
 
Сверху