Гуру, я не знаю что такое MVC в PHP, хоть и считаю себя опытным программистом. Объясните наконец!

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Mols, обычно я пишу ответы на сообщения, адресованные лично мне.
Я не вижу в твоем сообщении объяснения, что такое MVC в PHP, примеры удачных реализаций, чего-то, что я могу использовать в своей работе.
Ты доказал, что реализация MVC как паттерна возможна и существует. Никто и не думал спорить.
Я ставлю под сомнение эффективность его повсеместного применения. Я отлично обхожусь без контроллеров MVC.

Ты не согласен с не согласен с постановкой вопроса - создай свою тему.
Будут еще личные послания - пиши прямо мне в личку или аську.
 

Alien85

I like my cat
Вы кстати, тут распинаетесь и совсем забываете, что зависимостями структуры данных должна заниматься БД (там тоже можно писать программы).
За темы оформления должны отвечать таблицы CSS.
За работу с клиентом JS, ActiveScript.

А PHP должна получить запрашиваемые данные и выдать их в браузер. Всё :)
Программа не помнит клиента, она всегда начинается заново!

В текущих версиях PHP - MVC нет!
Вот когда ваше приложение будет работать в виде демона, тогда уже можно говорить о MVC. Может это когда-нибудь и будет.
А сейчас это не более, чем стиль программирования и ничего в этом плохого нет.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Alien85 ты топик-то почитай, мои посты на 1й странице
 

Mols

Новичок
grigori
Я не вижу в твоем сообщении объяснения, что такое MVC в PHP
Эм... ну правильно не видите.
Я ж и говорю, что тут обсуждение лишенное смысла идет.
Поскольку оно построено фиг знает на чём. И фиг знает, что вообще тут хотят выяснить)))
MVC в PHP НЕ существует.
Его нет априори. Как нет MVC в Ruby, MVC в JAVA....
У меня складывается такое впечатление, что Вы либо просто не понимете что значит "шаблон проектирования" либо просто троллите
Шаблон проектирования не привязывается к языку.
Есть только его реализации в каждом языке.
какие хорошие реализации... это вообще к топику не относится.

З.Ы.
[deleted]
 

itprog

Cruftsman
Я отлично обхожусь без контроллеров MVC.
а битрикс отлично обходится без паттернов проектирования вообще

Alien85
при чем здесь демоны какие-то? Если ты не можешь вписать MVC в Web, то представь что тебе нужен будет интерфейс на php-gtk, помимо веб-интерфейса. Если это нельзя будет сделать простой заменой вида - такой код на помойку.
 

Активист

Активист
Команда форума
Духовность, mols, читать прувы надо полностью, а так же книги от начала до конца, а не читать "интересные мне на первый взгляд главы".

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

Теперь несколько цитат (ключевые моменты выделены жирным) из ISBN 978-5-469-01136-1:
MVC отделяет вид от модели, устанавливая между ними протокол взаимодействия "подписка/оповещение". Вид должен гарантировать, что внешнее представление отражает состояние модели. При каждом изменении внутренних данных данных модель оповещает все зависящие от нее виды , в результате чего вид обновляет себя. Такой подход позволяет присоединить к одной модели несколько видов, обеспечив тем самым различные представления. Можно создать новый вид, не переписав модель.
Где изменения? В PHP обычные лаудеры.
Отношение вид-контроллер - это пример паттерна проектирования стратегия. Стратегия - это объект для представления алгоритма. Он полезен, когда вы хотите статически или динамически подменить один алгоритм другим, если существует много вариантов одного алгоритма или когда с алгоритмом связаны сложные структуры данных, которые хотелось бы инкапсулировать.
В MVC используются и другие паттерны проектирования, например фабричный метод, позволяющий задать для вида класс контроллера по умолчанию, и декоратор для добавления к виду возможности прокрутки. Но основные отношения в схеме MVC описываются паттернами наблюдатель, компоновщик и стратегия
В реализации "MVC в PHP" - в большинстве (99%) случаев нет этих паттернов, в них вообще не используется ни каких патернов, а происходит дробление на классы.

Таким образом требовать знать от кандидата какого-то там MVC - бессмысленно, поскольку это будет только его MVC.
 

whirlwind

TDD infected, paranoid
Активист я бы понял, если б ты открыл этот топ с целью сформировать собственное видением mvc, которое подошло бы тебе лично. Но таким образом как спор идет сейчас, можно договориться и до того, что в php и ооп нету, просто потому, что в 99% случаев все ооп сводится class/static function. То есть просто потому, что кто то не умеет их готовить мы должны делать вывод о наличии отсутствия?
 

Активист

Активист
Команда форума
Насчет отсутствия ООП, это ты зря! ООП есть. Я открыл этот топик только потому что, пытаюсь понять, есть ли MVC в PHP и справедливо ли требовать от человека его знание!

Если есть, то где и как его применить. Не делить и так скудный код на псевдо контроллеры и виеверы, а реально - показать его.
 

whirlwind

TDD infected, paranoid
Вся разница между MVC в PHP и например в Java заключается в том, что для PHP WebApplication это одна итерация все того же цикла обработки ввода-вывода. Но нет никаких языковых ограничений для реализации обработки ввода-вывода в цикле. Просто декорируем типовой WebApp фронт-контроллер чем-то подобным:

PHP:
function dispatch() {
    while ( $this->exitState->unsignalled() ) {
        $this->request->readInput();
        $this->commonDispatcher->dispatch();
    }
}
Представь, например, что readInput читает команды из STDIN.
 

Gas

может по одной?
Активист
вот Mols правильно сказал что в php/ruby/java его нет, то-есть на уровне языка нет такого понятия. Оно появляется во фреймворках. Это тру MVC (по Фаулеру) или нет - другой вопрос. То-что касается приведённых цитат - да, mvc в rails/php_frameworks не подходит под то описание, там всё расписано для долгоживущих gui приложений.

В http://en.wikipedia.org/wiki/Model–view–controller явно разделены "Implementations of MVC as GUI frameworks" и "Implementations of MVC as web-based frameworks". Пусть mvc в web'е притянут к классическому понятию, ну и что с того. Миллионы людей оперируют этим понятием, понимают о чём идёт речь и ничего страшного не случилось. Так-же как у нас говорят "ксерокс", а не копировальный аппарат, "джип", а не кроссовер или внедорожник.

Что касается должен ли php-программист знать mvc - то mvc, которое используется в php-фреймворках должен, не обязательно их всегда использовать но понятие иметь нужно. Если человек ещё знает корни mvc, как оно в gui используется, то вообще супер.
 

Mols

Новичок
От же ж упертый а)))
Мы обсуждаем, есть ли в PHP MVC, а так же справедливо ли от работника знать его в PHP.
Здесь Вы наверное имеете в виду требования вида "опыт работы с MVC фреймворком" либо "понимание MVC"
Думаю вполне справедливо.
Фреймворки есть, о чем речь понятно, паттерн тоже есть.
Для того, что бы определить - MVC это или нет, не нужно апеллировать понятием, нужно изучить свойства.
Боюсь вас удивить, но определение понятия - как раз и содержит перечисление свойств (то есть признаков).
.
Теперь несколько цитат (ключевые моменты выделены жирным) из ISBN 978-5-469-01136-1:
Ещё раз.
Всё что вы выделили жирным относится к конкретной реализации MVC.
И только.
Всё, что там предлагается решать через ОО паттерны - можно сделать без них. Без этих паттервнов.
Но в выбранном примере естественно они используются.
Потому как он выбран именно для демонстрации ОО паттернов.
То есть например вот это

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

А вот это
Но основные отношения в схеме MVC описываются паттернами наблюдатель, компоновщик и стратегия
Что здесь написано?
А здесь написано, что в схеме MVC есть ряд отношений которые можно описать паттернами наблюдатель, компоновщик и стратегия
И что это по вашему доказывает?
Ну можно (и даже удобно и правильно в рамках этого примера) и что?

Остальное выделенное жирным вообще не связано с OOP. Оно относится только к отношениям модель - вид

Когда что-то читаете контекст надо понимать.

З.Ы.
Вы же сами чувствуете, что есть что-то не правильное в этой всей Вашей теории.
Иначе бы не было топика.
У Вас просто очередной этап профессионального роста.
Когда Вы понимаете, что казалось бы известные Вам понятия похоже значат нечто другое, чем Вы думали последнее время)))
Из-за этого путаница в рассуждениях.
Но на самом деле это хорошо. Это значит, что Вы развиваетесь.

У меня такое бывает регулярно. Обычное переосмысление. Больше опыта - больше понимания.
Да... кстати здесь ISBN 978-5-469-01136-1 есть замечательный абзац
Несколько слов, чтобы предупредить и одновременно подбодрить вас.
Не огорчайтесь, если не все будет понятно после первого прочтения книги. Мы и сами не все понимали, когда начинали писать ее! Помните, что эта книга не из тех, которые, однажды прочитав, ставят на полку. Мы надеемся , что вы будете возвращаться к ней снова и снова, черпая идеи и ожидая вдохновения
Теперь завершение.)))
Я искренне желаю Вам разобраться в том, что вас беспокоит.
Всё что я писал в этом топике это тот уровень на котором я сейчас понимаю поднятый здесь вопрос.
имхо - Вы несколько запутались.
Не более, чем запутались и пытаетесь разобраться.
 

itprog

Cruftsman
whirlwind
Вся разница между MVC в PHP и например в Java заключается в том, что для PHP WebApplication это одна итерация все того же цикла обработки ввода-вывода.
Это о чем вообще? Вся суть MVC в отделении отображения от бизнес логики. Там нет ничего про итерации и ввод/вывод.
 

Mols

Новичок
itprog
Он пишет о разнице. А не о сути MVC.
Насколько я понял имеется в виду то, что приложение JAVA - работает "непрерывно", а в ПХП - каждый раз подгружается.
НО. Строго говоря и JAVA приложение не работает непрерывно в полном смысле .
Ему дискретно выдаётся процессорное время.
И оно тоже "засыпает" и "просыпается" хотя и не так как обычное веб приложение на ПХП.
Очень много отличий в механизме этого "засыпания просыпания".
Куча отличий.
Но ИМХО на определённом уровне абстракции даже это имеет нечто общее.
Просто в одном случае приложение "засыпает" и "просыпается" в рамках многозадачности ОС со всеми вытекающими.
А в другом случае - в других рамках.
Но это уже конечно дебри )))

[update]
Хотя может быть кому-то эта аналогия и поможет избавиться от когнитивного диссонанса)))
 

whirlwind

TDD infected, paranoid
> Там нет ничего про итерации и ввод/вывод.

Если ты не видишь внутри любой виндовой программы WinMain с PeekMessage/DispatchMessage, то это не значит что ее нет. Этот цикл и есть Observer и Strategy. Любая интерактивная программа работает в цикле получения ввода/обработки вывода. Пых внутри апача не работает как интерактивная программа, но это не значит что обработка ввода/вывода не может быть организована в стиле MVC, потому что внутри цикла обработки ввода (одна итерация) все программы, независимо от языка реализации, работают одинаково. Если кому то отсутствие цикла обработки ввода кажется достаточной причиной, для того, что бы утверждать что PHP не может быть MVC, так тому и быть.
 

Активист

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

Я занимаюсь программированием и собственно на этом клубе с 2002 года, и собственно раза три прочитал уже ISBN 978-5-469-01136-1, но до сих пор считаю что прочитать еще раз бы не помешало.

Так вот, на тот момент, здесь создавались отличные и замечательные проекты, которые до сих пор работают, на протяжении уже многих лет, тогда, не было понятия "MVC" и тотально его знания никто не требвал, а вот единые точки входа были, и разделение логики от отображения (тот же SMARTY), и контроллеры.

> Но основные отношения в схеме MVC описываются паттернами наблюдатель, компоновщик и стратегия
Вот ключевая фраза , утверждение, суть.

Что такое наблюдатель - его реализацию на PHP можно посмотреть в сети. Ни в одном контроллере, котрый здесь (на клабе) обсуждался я еще не встречал (хотя было пара исключений), так вот.
Как это должно работать я четко представляю. Мы создаем объект - модель модуля, контроллер, и вид, который находится в default состоянии и способен уже выводить данные. Скажем, приходит запрос клиента - показать новость. В этот момент, стретегия (контроллер) выбирает нужную модель и запускает его (интерация), модель определяет нужную новости, выполняет логику и информирует (наблюдатель) объект "вид" (компоновщик) , который сам меняет свои свойства, в зависимости от изменения модели. По своей сути, это три разных объекта. В любой момент, мы можем назначить несколько видов модели, например HTML, XML, CSV, и задача модели будет информировать все три объекта вида.

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

Что по факту мы видим в Веб'е.
Контроллер - стретегия (его реализация в PHP через include, что мы видим везде) и зачастую на него возлагают обязанности парсинга урлов, инклуда данных и часть логики (модели).
Вид - зачастую - также, стратегия, т.е. инклудим нужный TPL (PHP) и на этом все (XML или HTML и т.п.), что бы вид был объектом - я встречаю крайне редко.
Модель - та же стратегия

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

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

Активист

Активист
Команда форума
whirlwind
Я стал понимать ход твоих мыслей. Надо для закрепления создать MVC приложение на PHP, словно у него много интераций, я думаю все встанет на свои места.
 

Mols

Новичок
Активист
Ну вот зря вы пренебрегаете определениями.
Что такое шаблон проектрирования?
В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
Ну... то есть это некое решение задачи.
Только решение (одно из многих).
Правильное, воспроизводимое - но одно из многих.
То, что в вебе не применятся часть паттернов для реализации MVC это НЕ ЗНАЧИТ, что MVC в вебе не реализуемо.
Это значит, что есть специфика реализации и ВСЁ.

Да MVC подход впервые был реализован в GUI.
Примеры многие описаны для GUI....
Но это шаблон проектирования. Он стал шаблоном именно когда стал абстракцией.
То есть абстагировался от GUI, конкретного языка и т.п.

Ещё раз.
То, что при реализации MVC в каком либо фрейморке не использованы конкретные паттерны - не означает что MVC не реализован в принципе.
1. Так как паттерн - это одно из многих возможных решений.
2. Так как эти "конкретные паттерны" - взяты из примеров реализаций для GUI

Для понимания этого достаточно просто внимательно прочитать и понять определения MVC и "шаблон проектирования".

[update]
И да... это ни сколько не отменяет того, что было создано много хорошо работающего кода без использования этого подхода.
И совсем не обязывает всегда и во всем применять этот самый подход строго "по букве закона".
 

whirlwind

TDD infected, paranoid
Активист врядли это имеет смысл. Что бы обсервер в принципе заработал, надо что бы ввод поступил после его (обсервера) инстанцирования, что в пхп смысла не имеет. Надо рассматривать сам факт запроса как поступление ввода. Дальше фронт-контроллер=стратегия. Обсерверы в вебапп более менее имеет смысл только от M->V

PHP:
    // Controller
    function onInput() {
        $this->context->getView()->subscribe($this->object);

        // TODO: change model $this->object

        $this->context->getView()->unsibscribe($this->object);
    } 

    // View
    function subscribe(MutableDomainObject $object) {    
        $object->on('invalidate', 'onAttributeInvalidate', $this);
        $object->on('modified', 'onAttributeModified', $this);
    }

    function onAttributeInvalidate($attr, $value, $object) {
        $this->setVar("{$attr}Err", true);
        $this->setVar($attr, $value);
        $this->errors ++;
    }
    
    function onAttributeModified($attr, $value, $object) {
        $this->setVar("{$attr}Err", false);
        $this->setVar($attr, $value);
    }
 

Активист

Активист
Команда форума
Да нет, для многих суть MVC в вебе это разделить код по файлам/кассам и все, и определить - это будет контроллер, это модель, а это вид. Много ума надо? Раньше так и было, до введения этого паттерна. А теперь правят вики, ли ж бы напильником и молотком вбить туда.

whirlwind
Спасибо, интересно посмотреть.
Т.е., ты хочешь сказать, что в вебапп контроллер по сути отсутствует? Сохраняется лишь отношения model -> view?
 
Сверху