Как передавать данные в контроллеры? И надо ли их туда передавать?..

Духовность™

Продвинутый новичок
Как передавать данные в контроллеры? И надо ли их туда передавать?..

Вот, столкнулся с непониманием вопроса. Если мы строим какую-то систему, и имеем FrontController, который парсит URL, выбирает необходимый контроллер и действие. Допустим, мы запросили www.server.com/user/info/vova.html

FrontController, насколько я понимаю, должен запустить контроллер UserController(new User()) с переданным в него объектом User и выбрать метод UserController->info('vova') и передать в этот метод параметр 'vova' (или вызвать UserController->info('vova') теле главного метода - не суть важно).

Так вот, подобные действия подразумевают, что все подчиненные контроллеры, типа UserController имеют одинаковый интерфейс принимаемых параметров. В данном случае контроллер UserController() принимает только один параметр - объект типа User. Но в контроллер может быть передано много моделей! Тогда каким именно образом FrontController сможет понять, что и как передавать в подчиненный контроллер?

ИЛИ

Можно (нужно?) просто инстанцировать модели непосредственно в теле контроллеров, но я не вижу в этом варианте гибкости. Получится, что 1 контроллер == 1 логическая страница сайта. Мы в этом случае не сможем использовать контроллер UserController для какой-либо другой модели, удовлетворяющей интерфейсу User.

Спасибо :)
 

FB3

Новичок
ИМХО, в метод контроллера вообще ничего не должно передаваться. Он должен знать/иметь возможность получить данные POST/GET. И дальше сам выбирать, что делать. В данном случае создать юзера используя в конструкторе его id, т.е. $user = new User('vova') и вызвать для него метод $userInfo = $user->info(). А затем $userInfo передать во view. Вообщем, посмотри любой quick start мануал по созданию сайта на Zend Framework. Там ничего похожего на свою реализацию не увидишь.
Вот примерчик: http://zendframework.ru/articles/tutorial-building-basic-site-on-zend-framework-1-5
 

Gas

может по одной?
инстанцировать модели непосредственно в теле контроллеров
я так и делаю

имеют одинаковый интерфейс принимаемых параметров
параметры в экшены можно и не передовать, а передать объект Request в конструктор контроллера.

Получится, что 1 контроллер == 1 логическая страница сайта
почему это? в контроллере может быть много экшенов, каждый экшн может быть "логической страницей"

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

p.s. triumvirat ты с завидным упорством изобретаешь велосипеды, лучше посмотри как сделано у других, тот же ZF например.
 

Духовность™

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

если появятся другие точки зрения - их послушаем.

p.s. triumvirat ты с завидным упорством изобретаешь велосипеды, лучше посмотри как сделано у других, тот же ZF например.
пока банально нет времени :( сижу и в процессе работы постигаю все.
 

fixxxer

К.О.
Партнер клуба
>Получится, что 1 контроллер == 1 логическая страница сайта

один контроллер = 1 "тип" страницы, скорее.

можно использовать наследование - писать "обобщенный" абстрактный контроллер для некоего набора схожих страниц, и дальше от него наследоваться.

>FrontController, насколько я понимаю, должен запустить контроллер UserController(new User())

можно конечно и так. я обычно наследую все контроллеры от общего предка, получается цепочка вида Application -> WebPage -> SessionPage -> UserPage, при этом каждый класс в иерархии добавляет свои инициализационные методы в общую цепочку. А фронт контроллер это просто маппер URL на имя page-класса, я вообще без него обхожусь, используя в качестве маппера конфиг nginx :)
 
Сверху