[REVO] Чем плох Revo или 101 проблема архитектуры.

Вместо вступления.


Этот топик назревал давно. Материала было много — и я постараюсь его структурировать.

Цель топика НЕ
  • Доказать что MODX — УГ
  • Переубедить пересесть на что-либо другое
  • Критиковать modx как визитоделочную CMS

Цель топика же, в свою очередь
  • Вызвать попоболь у фанатиков (не путать с фанатами)
  • Показать недостатки
  • Modx — не CMF

Миграции — не, не слышал...


Вся боль и недоумение скрыты в заголовке.
В командной разработке миграции — неотъемлемая часть процесса.
Впихивать 100500 различных возможностей в 2 таблицы — ресурсов и тв полей — не есть хорошо.

Предположим мы пишем магазин. Сделали необходимые таблицы.
А дальше что? Пишем команде из 5-6 человек — забирайте дамп.
Ок… а тут нам пришлось внезапно кодировку поменять… накосячили при создании таблиц.
Снова пишем в скайпе — ребята, забирайте дамп.
И так до посинения =)

А теперь попробуйте вбить в гугл — Миграция Zend|Symfony|Laravel|Yii (любой на выбор)… и после этого миграция modx.

Миграция отсутствует как класс. Печаль.

Dependency injection — пэттерны для лохов!


Итак — посмотрим, первая версия modx revo — датирована 2008 годом, балом уже вовсю правил php 5.3
Мартин Фаулер написал статью о DI еще в 2004м.
martinfowler.com/articles/injection.html
Если тут не очень понятно о чем речь, то советую почитать Фабиена.
fabien.potencier.org/article/11/what-is-dependency-injection

Вместо того, чтобы использовать этот уникальный пэттерн (см. Yii, Symfony2, Laravel, Zend Framework, SwiftMail) как все нормальные фреймворки (напомню, что modx позицианирует себя как CMF), разработчики все запихали в один обьект обернув все «типа LazyLoad».

Конечно вы спросите, да зачем нам все это — работает же.
Конечно работает, вот только гибкости очень не хватает и приходится навешивать 100500 эвентов на банальные вещи, которые решаются через DI буквально парой строчек.

Репликация есть!


Вот тут modx немного удивил… Репликация есть!
Но как и большинство фич модекса она вызывает умиление.
Спрашивается — зачем все это ???

Возьмем стандартное поведение хороших интернет магазинов. А конкретно регистрацию пользователей.
Пользователь зарегистрирован в мастер. Через минуту он решил сделать покупку. Первую или очередную — не важно… Главное, что вся информация о нем в мастере. В слейве ее нет. Точно так же как и нет возможности указать модели работать только с мастером.
То есть, для операций чтения — пользователя еще не будет.
Когда я переписал нафиг весь AR в Yii, я внимательно смотрел на реализацию репликации в Propel и Laravel. Но ребята из modx — рещили сделать свой велосипед.
Жалко только, что он не едет.

to be continued...

если вас интересует больше конкретики по перечисленным пунктам, то я постараюсь их дополнить в свободное время

18 комментариев

avatar
Вот не обижайтесь, но читая данный пост я вспомнил бородатую фразу: «Я знаю ушу, карате, тхеквондо и много других страшных слов».

Какой DI? Какой мастер? «Какие ноги, я спрашиваю?» ©

Вместо «показать недостатки» вы написали классический трололо-топик. Те полтора землекопа кодера, которые могут это прочитать в этом сообществе и которые смогут вам что-то вменяемое написать в ответ, скорее всего просто пожмут плечами.

Оставь, что тебе до нас?
avatar
Ссылку про DI я скинул…
Остальное — в поиск.
Или гугл за неуплату отключили? Ладно так и быть — помогу habrahabr.ru/post/56702/
avatar
на мой взгляд — недостатки описаны, если кто-то не понимает, что к чему — я написал

если вас интересует больше конкретики по перечисленным пунктам, то я постараюсь их дополнить в свободное время

Но видимо главная цель достигнута и я смог
Вызвать попоболь у фанатиков
раз на конкретные недостатки в меня кидают фразу
Вместо «показать недостатки» вы написали классический трололо-топик.

гы гы чо
avatar

[20:25:45] alooze: чем интересно тебя не устраивает наше общение?
[20:26:19] *девушка*страуструпа*: Вот когда перепишешь весь AR в Yii, тогда приходи!
[20:26:32] alooze: каво?
[20:26:36] *девушка*страуструпа*: Я готова сразу отдаться тому, кто внимательно смотрел на реализацию репликации в Propel и Laravel и сделал правильные выводы.
[20:26:42] *девушка*страуструпа*: Жаль только что таких в природе нет. Один только мне встречался, но он увлекался реляционной полнотой, на меня ему было плевать.
[20:26:48] alooze: гад какой

avatar
он увлекался реляционной полнотой
щито?

Я не понимаю твой троллинг… Видимо выосокоинтеллектуален.

Ar — activer record (на вашем языке это примерно то же самое что xPDO)…

Сейчас AR в yii работает таким образом, что в нее крайне сложно внедрить репликацию (ссылку я давал).

Поэтому в рамках проекта Giny (http://devconf.ru/offers/13), разработкой которой занимается наша команда, я переписываю AR…
avatar
Мне конечно по большей части этот топик не интересен, но тезисно скажу следующее:
Вызвать попоболь у фанатиков — давно пора
Показать недостатки — они становятся очевидны только после глубокого знакомства с MODX
Modx — не CMF можно долго спорить. все зависит от того, кто как понимает термин CMF. Для кого-то это 1000 функций в 1 классе на все случаи жизни. А для кого-то действительно продуманая архитектура кода. В любом случае как гласит википедия
Ряд CMS, предоставляющих API для расширения своей функциональности, претендуют на звание CMF, хотя провести чёткую границу между CMS и CMF порой сложно.
Миграция отсутствует как класс. — в прямом смысле слова это так. Но есть система пакетов, которая позволяет реализовать эти самые миграции в процессе установки (обновить схемы/базы, создать плагины/контроллеры/процессоры и т.д.)
avatar
И да, я не фанат MODX Revolution. Но из данного топика я не увидел явных минусов.
avatar
Минусы:
— Отсутствие миграций
— Отсутствие репликации (она как бы есть — но не работает, опять же узкоспециализированная фича — навряд ли человек, работающий на modx будет ее использовать — это все же ближе к midload)
— Отсутствие вменяемого DIC, из-за чего приходится очень сильно ковырять админку и писать плагины, навешивать их на эвенты. (Подумай сам, как без костылей можно настроить 3 почтовика — phpmail — для админов, рассылки через mailChimp — для клиентов, smtp — для корпоративных клиентов. Это только один из примеров.)
avatar
Отсутствие миграций
Отписал ниже

навряд ли человек, работающий на modx будет ее использовать
У меня есть 1 проект, который специально делался на Revolution из-за того, что поддерживаются репликации. Для этих целей и поднимали 1 сервер в Linode, а другой у селектела. После полугода стабильной работы решили отказаться от этой фишки и остановились только на бекапах, т.к. затраты в течении полугода на поддержание 2 серверов начали превышать возможные потери во время перебоя на основном сервере.

Подумай сам, как без костылей можно настроить 3 почтовика
Давай вернемся в прошлое и посмотрим на Evo. Там в априори нет переключалок каким способом отправлять почту и т.п. Поэтому в каждом сниппете/модуле/плагине все реализуют так, как считают нужным. Это плохо, но зато опционально при помощи параметров к конкретному сниппету/модулю мы можем настроить как именно отправлять почту. В рево же появилась подобная опция в настройках и все стараются ею пользоваться. Но никто не мешает отказаться от глобальных опций использовать свои. Хотя не стоит забывать про наследовательнсоть: глобальные настройки можно перезаписать настройками контекста. Настройки контекста — настройками пользователя. и т.д.
Ах, да. есть ж еще modX::getService()

P.S. И да, я понимаю, что подходы используемые в Revolution далеки от стандартов и паттернов. Где-то даже я бы назвал это анти-стандартами. Но несмотря на все это MODX (будь-то Revo или Evo) позволяет расти программистам и как правило по следующей схеме: Evo (функциональное программирование) -> Revo (ооп) -> Any Framework (namespace, composer, трейты и т.д.). На данный момент я не знаю ни одного другого движка, который будет одновременно прост в освоении верстальщикам/начаинающим веб-разработчикам. И в тоже время, будет их стимулировать писать PHP.
avatar
На счет Any Framework, лично мне очень понравился Bluz от Шевчука.
avatar
За 1 день бывает такое:
1 человек в комманде написал свой валидатор(они же у модекс в базе)
1 человек добавил свою таблицу
1 добавил свой сниипет (хоть и на файлах — а ссылка то в базе)

Как им поможет поддерживать базу в актуальном состоянии система пакетов?
Или на каждый чих — пакет писать?
avatar
Насколько мне известно в толковой команде сначала продумывается вся база данных: таблицы/связи. Этот подход как раз позволяет избежать стократных изменений БД на дню. Со сниппетами да, беда. Но если пишется крупный проект, то городить огород из 1000 синппетов это бред, т.к. тут тоже как правило определяется четкий набор сниппетов: комментарии/регистрация/голосовани и т.п. Определившись с таким набором задач можно будет создать по 1 сниппету под каждую задачу, в котором инициализировать экземпляр необходимого класса и в зависимости от параметров переданных в сниппет выполняется то или иное действие: вывод формы/валидация данных/сохранение данных. Если же требуется написать какой-то узкоспециализированный сниппет типа подсчет числа комментариев, то можно вообще обойтись без еще одного сниппета (написать процессор) — тогда не потребуется делать ссылки в базе.

Или на каждый чих — пакет писать?
На самом деле там ничего сложно. Особенно если уже готова заготовка пакета и требуется просто добавить еще 1 сниппет. Если говорить про примеры, то я лично не вижу особой разницы между вот этим например и этим
avatar
На самом деле можно большую часть логики вынести в процессоры. Но это тоже бред, т.к. между функциями гонять JSON данные как-то не красиво.
avatar
Redjik, чтобы как-то перевести пост в позитивное русло, может посооветуете, пожалуйста, какую сисему мне изучать?))

Задачи стоят такие:
1) интеренет-магазин (максимум 50 тыс товаров)
2) большое количество готовых и по-возможности бесплатных модулей для e-commerce (фильтры и сортировки по товарам, загрузчик товаров в базу из xls, поиск, регистрация покупателей, подписка на рассылку, рейтинг)
3) Простой старт — легко развернуть на домашнем хосте, перенести на хостинг
4) Я не профессиональный верстальщик, программист и т.д. Работа с сайтом это скорее хобби, ну и небольшой доход, когда он работает)) Т.е мне не нужен хардкод, хочется чего нибудь-доступного))

Сейчас пользуюсь MODx начал с EVO. EVO не устраивает отсутствием готовых модулей для полноценного магазина — фильтров товаров, скидочных карт, управления стоимостью доставки.
Конечно все это преодолел, сделал и настроил, но все больше похоже на костыли. Еще ни один модуль на моей памяти не заработал без ковыряния в его коде, даже CSS starRating)). Сейчас, когда в переделанный мной код залезаю становится странно, как это все работало и переписываю заново)). В Revo всего побольше и написано получше, в коде уже почти не копаюсь, но все равно шаг влево и уже контексты не переключаются, нет нужных модулей или они не доработаны еще т.п.
avatar
ну и вот еще минус — даже не откоментировал никто, где тут люди))
попробую wordpress посмотреть, жаль времени будет если и там уныло все…
avatar
даже не откоментировал никто
А какой смысл вам отвечать, если вы обращались к Redjik?
avatar
хоть беседу поддержать, а то Redjik не отвечает))
почитал про wordpress, там все что спрашивал по 99$ оказалось, дороговато для теста получается))
сунулся в drupal, но там концепция немного другая, может попозже еще попробую почитать
avatar
фильтры и сортировки по товарам, загрузчик товаров в базу из xls, поиск, регистрация покупателей, подписка на рассылку, рейтинг
Я конечно не берусь утверждать, но более чем уверен, что вы не найдете настолько гибкую систему, что сможете парой кликов настроить все тонко под себя. Нет, настроить конечно сможете, но это получится обычный такой сайтик. Понадобилось новое поле — лезь в код. Ну допустим. Загрузчик товаров в базу и xls. Как вы себе это представляете? Указываете, что столбец А — название, столбец Б — цена? Дык есть это и под MODX Evo/Revo. Но я на 100% уверен, что вы не найдете решения, если, например, у вас в названии зашиты характеристики: «краска ХХХ, цвет белый, 1л.».

Аналогично и подписка на рассылку.
— отправка с сайта (есть под ево и рево)
— рассылка при помощи стороннего сервиса (smartresponder, unisender, т.д. их тысячи). Если интегрировать с веб-пользователям, то вам к API. А подписывать вы кого хотите? Пользователей после регистрации? Всех посетителей сайта? Не проще ли просто поставить HTML форму подписки того или иного сервиса и не париться. Благо любой сервис позволяет изменить шаблоны писем и т.п. Или у вас преимум сайт, который из религиозных соображений не приемлет сторонние сервисы?

Что там еще у нас? Регистрация? Есть. И если внимательно читать топики на сообществах, то можно научиться регистрировать пользователей как вам вздумается. И через oAuth и средствами MODX.

Ну и последнее. Фильтры и сортировки. Без знаний HTML вы эти сложные фильтры никогда не настроите ни на каком движке. А примитив можно сделать даже при помощи MODX, и даже на Evo, и даже без ковыряний кода (см. autoFilter).

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

Ну и да, если вы любитель кнопочек — то вам прямой путь в поклонники Revolution. Там все стараются привести к кнопочному виду, но топик не про это. Топик про то, как это выглядит все из нутри (в техническом плане). И как хотелось бы на самом деле: с соблюдением стандратов, паттернов, неймспейсов и прочей лабуды.
Комментарий отредактирован 2013-04-27 21:23:27 пользователем Agel_Nash
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.