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

whirlwind

TDD infected, paranoid
Активист нет, контроллер как раз присутствует. Просто он не подписывается на request, а инстанцируется фронт-контроллером, который strategy (ну я тут повторяюсь)

PS. то есть тут тот же самый классический MVC для интерактивных программ, только без контроллера-наблюдателя. Просто потому, что потенциальные наблюдатели создаются как реакция на ввод. Если контроллеры подписывать, то их надо сначала инстанцировать, а потом запускать процедуру обработки ввода. Это просто не подходит.
 

Активист

Активист
Команда форума
А, понял о чем говоришь. Тут и спорить не надо, это уже сто лет.
А разве фронт-контроллер не является ли самим контроллером, зачем ему еще раз инстанцировать некий объект контроллера? Что он будет контролировать, ведь по сути стратегия уже выбрана в фронт-контроллере, остается лишь информировать нужную модель (которая уже выбрана фронт-котролером), а далее заставить вид отрисовать выбранную модель?
 

whirlwind

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

По второй части тоже не совсем так все просто. Ведь не обязательно запрос связан с одним классом модели. Обычно на странице данные нескольких объектов. Компоновкой занимается контроллер.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
whirlwind спасибо за пищу для размышлений

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

korchasa

LIMB infected
whirlwind
По каким критериям ты выделяешь хэлперы и методы внутри них? Они у тебя всегда stateless, судя по названию? Почему именн хэлперы, а не сервисы?
 

whirlwind

TDD infected, paranoid
Первоначальная цель - это возможность написания вменяемого теста контроллера. Выделяем от потребностей. Берем самую сложную страницу, и выносим логику в хелпер. Разбиваем на методы так, что бы можно было скомпоновать для любой страницы, на которой модель используется. Например, в списках-таблицах не нужно выводить список пакетов, селект единиц измерения, выбирать сайт итп. Следовательно, вместо одного универсального toModel/toView делаем несколько методов. Хелперы нам нужны как минимум потому, что у нас несколько интерфейсов (если быть точным 4). И дублировать в каждом из 4х контроллеров то, что вынесено в хелпер смысла никакого нет. stateless они только по отношению к модели, внутри еще вид. Хелперы, а не сервисы, потому что от view helper. Хотя особой роли это не играет. Можно считать исторически сложилось.

PS. вот так тест контроллера выглядит. Конечно не идеальные, но гораздо лучше того, что было изначально. С фикстурами модели etc
 

korchasa

LIMB infected
Делали похожую реализацию, но через специализированные view. Правда потом сильно их урезали, выделив слой сервисов.
 

no_santa

Снегур
MVC - это архитектура приложения. ООП - способ программирования. Зачем сравнивать разные вещи?

ТС - респект за мегаопытность, но в вики сходите все-таки. У нас с такими деревянными убеждениями вы бы даже собеседование не прошли :)
 

Adelf

Administrator
Команда форума
ТС - респект за мегаопытность, но в вики сходите все-таки
Да нет что ты... википедию специально поправили идиоты. И любые, даже абсолютно логичные рассуждения оттуда - фигня.
 

igortik

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

Предлагаю составить план последовательности обработки запроса или в отдельности описать M, V, и C тезисами (каждый этап), если уже продолжать дискуссию...
Интересно, у кого выйдет более краткий и лаконичный метод :)

P.S. С себя начинать не буду, 6 был др.. мозги еще пару дней собирать придется...
А почитать будет очень интересно :)
 

no_santa

Снегур
Ну да, согласен. Вообще, говорить о том, "есть ли MVC в PHP или нет" - глупо, так как это действительно сильно разные вещи, как стратегия и тактика, философия и насущное, концепция и способ реализации. MVC - это всего-лишь универсальный принцип для разделения частей приложения, в широком смысле. PHP - всего-лишь язык программирования. Чтобы он когда-нибудь противоречил MVC - никогда не замечал, и уверен что не замечу в будущем, так как просто не смогу столько выпить.

Давайте лучше поговорим о том, что лучше - PHP или Windows? Ну, или вариант попроще - алкоголь или секс? :)
 

HraKK

Мудак
Команда форума
научитесь наконец отличать ООП от ООП.
 

igortik

Новичок
Я почему тему-то затронул про "наилучшую реализацию" - потому что это ключ к ответу на все вопросы и здесь почвы поговорить гораздо больше, чем высасывать из пальца M...V...C....
В моем понимании идеальная минимальная сборка CMS должна:

1. "Состоять из приложений" (сайт - конечная морда, отдаваемая клиенту, админка - интерфейс для административной группы, crm какой-нить и т.д.)
/applications/site/ (например)
/applications/adm/ (например)
/applications/crm/ (например)

2. Иметь понятие "модуль" (как ни крути, у модуля есть своя статика - макеты, css, js, есть контроллеры и акты), имхо, сложно назвать news, например, просто контроллером с набором моделей, т.к. нужно как-то в древовидной структуре систематизировать все файлы, а отделять статику модуля от скриптов, конечно, - можно, но пропадает систематизация.
3. Модуль должен состоять из:
3.1. Контроллеры
3.2. Модели
3.3. Статика
3.1.1. Все это лежит в одной папке, например, news

news
news/static
news/controllers
news/models
news/config.php

При этом:

/applications/site/news/ (например)

4. Реализация ООП должна быть минимальной (уже вижу, как летят в мою сторону камни)
4.1. Я уже писал где-то, что, на мой взгляд, ООП создает немало "зависимостей" по всему коду.. один наследует одно, последующий другое и т.д.
Появляется необходимость бдительной отладки и документации деталей, учета массы иных вариантов.
Ведь по сути-то, нам нужно просто обработать запрос и послать его на верный контроллер, а некоторые эту процедуру превращают в полет фантазии и рождаются CMS с более 100 инклудов за один проход. Опять же, это все субъективное мнение относительно ООП. Мне лично подходит реализация классами с точки зрения группировки однородных функций, но пока не встречал надобности в наследовании "на каждом шагу".
4.3. Все методы должны носить минималистические названия, понятные не только автору (не имеет значения, есть фак и нет)
5. View не должен превращаться в отдельный язык программирования. Его функция разобрать сущности в макете, например, {foo} - это переменная, {foo(bar)} - это функци, {*say_hello*} - это языковая сущность $lang_var['say_hello']
5.1. Вьюха пассивная или активная, вот это вопрос. В такой реализации минимальной, то и разницы-то не будет по скорости (не мерял, это допущение)

ну и еще масса мелких моментов, например:
- Стоит ли делать как в ZF инклуд файлов с поиском по заведомо заданным базовым путям, если сами разработчики указывают на оптимизацию очередности этих путей, чтобы не возникало "задержек"?
- Кеширование на файлах, - часть данных кешируется, преобразовывая некоторые сущности из макета, а некоторые оставляет для обработки и вызова функционала, иная часть кешируется memcached, например, некоторые тяжелые mysql запросы.
-- имхо, кеширование, одно из реально узких мест всегда
- RBAC разделение прав доступа к контроллеру, только оно будет требовать описание отдельного массива, например: $access[1]['addUser'] = true (разрешить группе юзеров с ID == 1 доступ к контроллеру). Возможно, у вас иные мысли на этот счет?
....

Я не претендую изобрести что-то новое и рвать стереотипы, но, полагаю, что для реализации быстрой, надежной и безопасной системы достаточно уложиться в 100-200 кб. (включая репозиторий: работа с формами и т.п.).

P.S. Вообще, я бы с радостью поучаствовал в каком-то совместном открытом проекте по реализации нечто такого минималистического, не нагруженного переизбытком умственного потенциала, где понятие "это нужно" обосновывается, а не впихивается клочками кода "про запас", а допустим лишь рост библиотеки хелперов и прочего функционала :)

P.S. Надеюсь, я разрядил немного тему споров "есть или нет MVC" :)
 
Сверху