MVC: little question

Adelf

Administrator
Команда форума
MVC: little question

Проблема проста.. нам необходимо...
Я лучше опишу не свою проблему, зато еще проще:
Допустим у нас есть, статьи, картинки, видео и другие сущности на сайте.
Каждую из них необходимо комментировать.
Как решить эту проблему в MVC парадигме? Если просто показывать комменты - то можно и хелпер какой-нибудь там.. но надо же их и редактировать и удалять..
Правильно ли я осознаю, что это прямая дорога в HMVC? Если так - хочу полезные линки :) Так сразу не нагуглил.
 

Духовность™

Продвинутый новичок
не понял, в чемвопрос

Если просто показывать комменты - то можно и хелпер какой-нибудь там..
контроллер должен вытаскивать комменты

но надо же их и редактировать и удалять..
контроллеров это дело
 

Adelf

Administrator
Команда форума
triumvirat
т.е. контрооллер картинок вытаскивает комменты,
контроллер видео вытаскивает комменты,
констроллер статей - тоже.
Мне бы хотелось все-таки всю логику работы с комментами - в чем-то одном иметь.
 

Fortop

Новичок
Adelf
Если комменты выводятся виджетом, то можно и отдельный контроллер.

А если нет, то лучше иметь сервисный слой, который и использовать в разных контроллерах.
 

Adelf

Administrator
Команда форума
HraKK
Комменты нужно доставать из базы - нужна модель.
Комменты нужно роутить как-нибудь(add/edit/delete ссылки там..) - нужен контроллер.
И показывать их тоже нужно.

Прально ли я мыслю, что из контроллеров клиентов(статьи, картинки) - нужно как-то похитрому вызывать конроллер комментов и и опять-таки както похитрому вставлять все в свое вью?

-~{}~ 09.04.10 21:20:

>> сервисный слой
Это что? На пальцах хотяб.
 

Fortop

Новичок
>> сервисный слой
Это что? На пальцах хотяб.
В простейшем случае это Модель.

Но в сложных случаях это

сервис <-> PDO <-> маппер

-~{}~ 09.04.10 20:25:

Комменты нужно роутить как-нибудь(add/edit/delete ссылки там..) - нужен контроллер.
роутить не обязательно.

Пусть все приходит в этот контроллер и даже в тот же action
просто позаботиться о перехвате и обработке нужных параметров.
например так

PHP:
if ($commentService->isValid($this->_request->getParams())) {
    // чего-то делаем.
}
 

Духовность™

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

Fortop

Новичок
зачем из контроллера контроллер вызывать?
На самом деле и это можно.
Если роутинг и диспетчер легковесны, а контроллер несет часть функций модели.

Вопрос лишь в сложности и адекватности конечного решения.

-~{}~ 09.04.10 20:33:

P.S. это
одна логическая страница
тоже не у всех так.
 

Adelf

Administrator
Команда форума
PHP:
if ($commentService->isValid($this->_request->getParams())) {
Ну фактически это и есть вызов sub-контроллера.
Т.е. комментарии - это действительно как сервис.. оговаривают как их должны обслуживать рутовые контроллеры(когда просто сгенерят комменты - рутовый сервис может просто вставить их в какое-то место у себя во вью.. а если говорит - дай мне всю страницу - контролер это "понимает" и не показывает сам, то что хотел показать, а показывает то, что хочет commentService..)

Ну я так примерно и представлял.. Думал мож че поэлегантнее придумали :)

-~{}~ 09.04.10 21:45:

Мне вот картинка понравилась:
http://www.javaworld.com/javaworld/jw-07-2000/images/jw-0721-hmvc1.gif

Отсюда брал: http://www.javaworld.com/javaworld/jw-07-2000/jw-0721-hmvc.html?page=2
 

fixxxer

К.О.
Партнер клуба
ну можно и так сказать, только наследованием реализовывать совсем неудобно. а по сути примерно оно, да.
 

webdeveloper

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

Любой проект пожалуй можно разбить на слои, к примеру так: DAO, Services, GUI.

DAO - абстрагирует доступ к базе данных через набор компонентов
Сервисы - позволяет манипулировать объектами которые хранятся в базе данных (не путать с самимим DAO объектами)
GUI (UI) пользовательский интерфейс. по большому счету проект может имень несколько разных GUI (в случае с Java это может быть (Веб сайт и еще и административный интерфейс на свинге)

MVC это по большому счету просто design pattern для написания GUI. Вот как это работает:

controller - читает user input и основываясь на том, что запросил пользователь, вызвает те или иные сервисы. Сервисы вызвращают некие объекты (хотя могут и не возвращать). после этого controller создает экзепляр Model объекта (в общем случае копируя информацию из доменных объектов которые получены из сервисов). после того как Model приготовилна, controller передает управление на View. View занимается тем что просто отображает тот объект который ему передали (Model).

Model не знает ничего о view и controller и не может обращаться к ним.
View не знает ничего о model и controller и не может обращаться к ним.
Controller единственный объект который может обращаться к обоим.

Ну а теперь к твоим коментариям. У тебя есть модель - назовем ее PageWithCommentsModel - в этом объекте у тебя может быть коллекция других объектов - назовем их Comment. Еще у тебя есть PageWithCommentsController и pageWithComments.php - View


в общем случае на уровне псевдокода это может выглядеть примерно так:
PHP:
<?php
//PageWithCommentsController.php

$pageService = new PageService();
$commentsService = new CommentsService();


$content = pageService->getPageContent($_GET["id']);
$comments = commentsService->getCommentsForPage($_GET["id']);
$pageWithComments = new PageWithComments();

$pageWithComments->setContent($content);
$pageWithComments->setComments($comments);
$_SESSION["currentModel"] = $pageWithComments;


?>
ну и внутри View

PHP:
<?php
//pageWithComments.php

include_once('PageWithCommentsController.php');

$pageWithComments = $_SESSION["currentModel"];
......

//here you display your model $pageWithComments


?>
если что-то не понятно - спрашивай коллега.
 

fixxxer

К.О.
Партнер клуба
Так-то неправда, но GUI-шный MVC - это единственный вариант паттерна,практически всеми понимаемый однозначно.

Я в последнее время вообще предпочитаю не использовать этот термин, предварительно не убедившись, что мы с собеседником его понимаем одинаково ;)
 

webdeveloper

я не ястреб войны, я тяжеловооруженный голубь мира
Автор оригинала: Fortop
неправда Ваша.

Почитайте о MVC, а для расширения кругозора о multi-tier архитектурах.
В данном случае это именно так и есть. Человек задал конкретный вопрос, применительно к конкретной ситуации. Я дал ему конкретный ответ, как решить задачу.

Теретизировать на тему архитектуры дело не благодарное - сколько людей столько и мнений.
 
Все что рассказывали выше справедливо для push view. В случае с pull view тебе будет достаточно написать один view helper, который принимает, помимо прочего, тип сущности (статья, картинка, видео) и отдает список комментариев. Это касательно отображения. Если модели у тебя реализуют единый интерфейс, то добавление / удаление сможешь без проблем реализовать одним контроллером комментария.
 

no_santa

Снегур
Насчет HMVC...
Некоторое время назад, глядя на кохану и т.п. дернулся в этом направлении, но потом остановился, и как оказалось не зря. Реализации MVC даже в базовом понимании позволяют сделать все, заявленное в HMVC, при этом более оптимально.
К примеру:
1. Разделение модулей HMVC - естественное деление моделей MVC, которое происходит даже более гибко
2. Сливание стилей и клиентских скриптов - работа с текстом для программиста никогда не была проблемой, вне зависимости от среды. Придумывать или внедрять новую догму вместо того, чтобы написать пять строк...
3. Быстрая "компоновка" новых приложений из старых модулей - рассматриваю как недостаток, так как каждая задача любит "чуть больше" внимания, и, по опыту, клиенты это ценят
 

zerkms

TDD infected
Команда форума
Вурдалак
Фишка в том, что я категорически не понимаю пляски вокруг HMVC. Не понимаю в том смысле, почему конкретно этот подход, который, кстати говоря не выходит за рамки MVC, вдруг решили назвать новым термином.
 
Сверху