Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> логика MVC 
V
    Опции темы
g27
Дата 6.2.2013, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Здравствуйте, практикуюсь с MVC. Допустим на странице отображается список товаров скажем. Так вот, маршрутизация определяет, что необходимо вызвать контролер товаров и их модуль. Контроллер товаров получает данные из модуля, отображение приводит их в нужный вид и на выход.  Помимо этого на странице может находится много другой информации. Начиная меню пунктами, информация о активном пользователе и т.д. Так вот у меня вопрос, теоретически на каком этапе правильно будет это всё обрабатывать? Я так понимаю для генерации меню, должен быть контроллер меню. Но в каком месте и кто его будет запускать? Неужели тот самый контроллер товаров и его метод вывода списка товаров будет инициализировать дополнительные элементы? Мне кажется, что контроллеру товаров не нужно знать о таких вещах. Объясните пожалуйста.
PM MAIL Skype   Вверх
Arantir
Дата 6.2.2013, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



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

Вообще внутренне использование контроллеров (вызывать один контроллер внутри другого для получения вида этого второго контроллера) - это нарушение самой концепции, сути контроллера.

Есть так называемое двухэтапное отображение. Сам термин и так везде описан, по этому скажу немного проще: выбираются все нужные куски (по их названиям, например), а уже под конец все они разом складываются.

Понятное дело, что прописывать взятие кусочка с меню в каждом контроллере, неудобно. По-этому, на практике часто используют layouts (не знаю как нормально перевести, дословно - макеты). Суть в том, что есть несколько слоев. Например, общий слой, слой контроллера, слой действия. Для удобства все они подхватываются автоматически из заданных папок. При этом сначала берется общий слой, в него вставляется слой контроллера (в том месте где вставлен вывод контента из вида), а потом в это все вставляется слой действия.
Таким образом меню можно расположить в общем слое и оно будет автоматически на всех страницах. А список товаров для слоя контроллера страницы товаров будет на все страницах раздела товаров при любом действии (ну всяких там добавлениях, удалениях и прочих).

MVC - это очень сильно абстрактная концепция. Например то, что для онлайн игр существует устанавливаемый клиент, вся математика на сервере, а обмен данными идет в виде простеньких пакетов - это тоже MVC, это, возможно, даже больше MVC, чем MVC в вебе (в php-фрейморках). 

Трудность понимания MVC с которой сталкиваются веб-разработчики состоит в том, что у пользователя есть только интерпретатор (браузер) и по сему абсолютно весь вид приходится отдавать с сервера, а это несомненно требует некоторой логики помимо бизнес-логики. В частности решения проблем с однотипными блоками на разных страницах без лишнего повторения кода. По-этому одними только контроллерами и html-файликами не обойтись. Зачастую вид - это класс или набор классов, которые сами подхватывают файлики из нужных папок, все это складывают (но без изменения данных) в нужном порядке, подставляют заданные данные и выполняют прочую рутинную работу, которая не имеет отношения к контроллеру и бизнес-логичке.

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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
g27
Дата 6.2.2013, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Arantir, огромное спасибо за Ваш комментарий. Мне кажется я понял, но перескажу на пальцах. Берётся один слой (шаблон можно сказать?), он самый главный. В нём есть скрипты для генерации меню и т.д.. Так же оставлено место куда будет вставляться слой контроллера. В слое контроллера есть тоже информация, которая будет всегда при его вызове, но так же есть и место, куда будет вставляться другой слой, который зависит от выполняемого действия. Думаю я правильно понял.
У меня вот ещё вопрос, по поводу слоя действия. Он должен знать в каком слое контроллера он будет находится? Мне кажется что нет, это должен знать только контроллер, который и определит что должен увидеть пользовать в конечном итоге. да?
PM MAIL Skype   Вверх
Arantir
Дата 6.2.2013, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



В целом все верно.

Вид - это только статичный html и места для вставки данных (что-то на подобии <?=$this->get("some_var")?>), ну еще могут быть циклы для вывода однотипных блоков с массива (постов, новостей) и ничего более. В идеале он должен быть таким, чтобы его понял HTML-верстальщик без малейшего представления про модель.

Слой действия - это так же, как и слой контроллера. Он по-умолчанию берется автоматически. Обычно для этого названия слоев контроллеров имеют имена контроллеров, а слои действий имеют имена действий и расположены в папках с именами контроллеров.
Например:
view/poducts/select.phtml
view/layers/products.phtml
view/index.phtml

Тут пути определяются просто:
1. {view_dir}/index.phtml
2. {view_dir}/layers/{controller_name}.phtml
3. {view_dir}/{controller_name}/{action_name}.phtml

Это все дело вкуса и оправдание цели средствами. Для какого-то сайта-визитки достаточно не более двух слоев, так как адресов глубже чем example.com/controller/ нет. Для большинства сайтов, не являющихся какими-то веб-приложениями/сервисами достаточно вышеописанной 3-слойной схемы. Для более сложных видов могут использоваться автономные вставки мелких слоев (подобных слоям действий).

Конечно же, стоит оставить возможность отключать и изменять слои. Например, если все уже на слоях и первые 2 можно выключить, то можно без особых проблем в  2 строчки добавить вывод только вида действия при запросе к контроллеру через AJAX (у них особый заголовок, гугл в помощь). Один контроллер, а делает сразу 2 дела - для GET выдает страницу, для AJAX только последний слой. Динамическая AJAX-подгрузка готова на 80% практически автоматически.
При хорошем проектировании всегда есть много таких приятных "побочных эффектов".

Суть в том, чтобы не дублировать никакой разметки. То есть одно и то же меню на всех страницах хранится в одном файле (например, главном слое), а не в файле каждой страницы.
Так же суть в том, чтобы не дублировать и php-код. Зачем делать что-то вручную, если это можно повесить на машину - в этом ж то весь прикол программирования.

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

В большинстве фреймворков вид будет отрисовываться автоматически, без каких либо действий в контроллере.

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


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
g27
Дата 6.2.2013, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 216
Регистрация: 29.9.2007
Где: Vilnius

Репутация: нет
Всего: нет



Всё понятно. Спасибо, очень помогли! 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.