По мере возможностей знакомлюсь с Laravel. Как человек, увлекающийся программированием, чувствую себя как ребёнок в магазине игрушек. Столько интересного. Тут используются почти все современные техноголии — и композер и внедрение зависимостей (Dependency Injection) и полноценная поддержка контроля версий и модульное тестирование и удобная возмножность привыкнуть к стилю работы в командной строке и возможность подтянуть знания в php. Как говорят в спорте — играй с тем, кто лучше тебя, чтобы повысить свой уровень. Этот как раз тот случай. Эти знания пригодятся при освоении любых современных фреймворков.
Ещё одним отличием Laravel является то, что он рабработан по концепции MVC (Модель-Вид-Контроллер), согласно которой бизнес-логика отделена от представления. Каждая часть отвечает за свой участок и минимально влияет на другую часть. Данный подход используется во многих современных фреймворках.
В Laravel уже реализован паттерн Middleware, представляющий собой промежуточные слои обработки запроса или ответа. Такую возможность Jason Coward (aka opengeek) обещал нам в MODX 3, который, как мы знаем, так пока и не вышел.
Давайте обзорно пробежимся по отличитальным возможностям Laravel, которые бросаются в глаза.
Обзор возможностей
Самое главное отличие Laravel от MODX — это то, что она является фреймворком, в то время как MODX — это все-таки CMS с элементами фреймворка. Поэтому в Laravel изначально нет админки. В ней вообще нет никаких элементов, в то время, как в чистой MODX админка есть. Поэтому в Laravel вы не сможете сразу набить какие-либо статьи. И это звучит ужасно для администраторов и контент-менеджеров MODX. Но я не готов заносить это в недостатки фреймворка. Ведь часто администраторы сталкиваются с задачей закрыть большую часть разделов админки для менеджеров и для безопасности и для упрощения пользования ей. А для разработчиков админка MODX с её стареньким ExtJs — это как заноза в одном месте. Для Laravel есть много готовых админок, которые можно выбрать для конкретной задачи. Так что ещё вопрос — плюс это или минус.
Отсюда вытекает ещё одно отличие — в Laravel нет контекстов. Админка — это просто страницы, закрытые для гостей и пользователей, не имеющих соответствующие права.
Ещё в Laravel нет сниппетов, плагинов и процессоров. За всё отвечают контроллеры, использующие базовые или пользовательские классы, которые реализуют собственную бизнес-логику. В плагинах нет надобности. События используются также как в javascript — создали событие, создали слушателя и вызвали событие в нужном месте — fire('Event')
. Сниппеты тоже не нужны. Они используются в MODX как альтернатива шаблонизатора — т.е. в разметке вызвать php код. В Laravel есть встроенный шаблонизатор Blade, в котором можно вызвать необходимый метод, реализующий код сниппета.
Но есть шаблоны и виды, которые можно сравнить с чанками. А пользователи MODX, освоившие шаблонизатор Fenom (особенно использующие файловые элементы), разницы практически не заметят. А шаблонизатор Blade очень легкий в освоении и многое в нём уже знакомо по Fenom.
У Laravel есть своя ORM для работы с элементами базы данных как с объектами. Называется она Eloquent. Но в отличие от xPDO её конструктор запросов обладает большими возможностями. Кроме того, схемы моделей строятся в разы проще. Для сравнения, в MODX для создания своей модели нужно пользоваться специальными дополнениями. Например, CMP Generator. Можно и самому создавать схему, классы, мап файл. Но это задача для прокаченных модиксеров. А в Laravel всё проще — создаётся миграция. Причём синтаксис у неё очень простой. Вот как выглядит схема таблицы пользователей:
Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); });
И всё. Вторым шагом создается модель — или вручную или через командную строку. Вот класс модели:
namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Notifiable; protected $fillable = [ 'name', 'email', 'password', ]; protected $hidden = [ 'password', 'remember_token', ]; }
И никаких сложных массивов и т.п. После этого можно пользоваться объектами User.
Следующее отличие Laravel от MODX — при установке какого-нибудь модуля нужно провести ряд дополнительных манипуляций — дописать классы для загрузки или создать таблицы. В MODX с этим проще — поставил и всё сразу работает.
Ещё раз про сниппеты. В Laravel нет надобности в сниппетах getPage или Login. Все это есть уже из коробки. А ещё есть функционал уведомлений, который поддерживает и Email и SMS и Slack и т.п. Не надо ставить отдельные пакеты. MODX умеет работать только с email.
Если говорит о привычных сниппетах типа getResources и т.п., то они легко заменяются моделями.
//Article - это класс модели статей по аналогии с классом модели User в примере выше. // Получить все статьи Article::all(); // Все опубликованные статьи родителя в id=5 c сортировкой по дате публикции. Article::published()->where('parent','5')->orderby('published_at','DESC')->get();
У некоторых читателей может возникнуть справедливый вопрос — а как Laravel понимает из какой таблицы зачитывать модель User или Article, ведь нигде таблица не указана? Скажу, что здесь творится магия. ? На самом деле в Laravel принято соглашение, что модели должны называться в единственном числе (User, Article), а таблицы с данными для этих моделей во множественном числе. Например, модель называется User, то таблица для неё будет называться users, для модели Article — таблица articles и т.д. Если это правило у вас не выполняется, то в модели нужно указать специальное свойство $table
:
// Модель Article protected $table = 'site_content'; ...
Вообще, разной магии в Laravel очень много и это реально круто и удобно.
У Eloquent есть очень много классных методов. А ещё аксессоры (getters), мутаторы (setters) и области запросов (scope). Об этом можно прочитать в руководстве.
Очень удобный механизм работы с сессиями. Есть даже интересная возможность создания одноразовых сообщений, которые Laravel удалит после первого использования.
Есть миграции. Это такая легкая система версионности для таблиц. Например, первая миграция создаёт таблицу. Вторая миграция добавляет новую колонку. Откатили последнюю миграцию, колонка удалилась. Накатили другую, в которой изменили размер уже существующей колонки. Вся история изменений сохраняется. Очень удобно.
Функционал для работы с кэшем значительно проще, чем в MODX.
А вот в плане обновления Laravel отстаёт от MODX. И причина в том, что изменения ядра часто не поддерживают обратную совместимость. Один из примеров — в новой версии Laravel события для работы с пользователями стали классами. И если обновиться, то они перестанут работать и надо переписывать все обработчики. В MODX такое проблемы нет — накатил обновление и работай дальше.
В общем всё не опишешь. Да я ещё и не всё открыл для себя. В дальнейшем я постараюсь раскрыть важные моменты. Но вы можете сделать это самостоятельно. У Laravel есть очень подробная документация и видео подкасты.
Заключение
Данная статья — это легкий обзор отличий Laravel от MODX, а не глубокий анализ преимуществ и недостатков каждой системы. Я описываю впечатления от Laravel глазами MODX разработчика. Для программиста, уверенно знающего php будет не сложно освоить этот фреймворк. А пользователям, освоившим MODX на уровне сниппетов и плагинов, с чистым фреймворком будет трудновато. Но в процессе моего освоения Laravel, я думаю, и мы решим эту проблему.
Интересно было узнать твоё мнение по поводу MODX и Laravel. Я примерно в такой же ситуации — на распутии. Попробовал на Yii2 создать небольшое приложение (минибложек), потом на Laravel примерно такое же и затем сравнивая эти два фреймворка мне Yii2 показался более понятным и функциональным чем Laravel. Интересует, пробовал ли ты использовать Yii2?
MODX — это CMS с небольшим набором сопутствующих инструментов. До знакомства в Laravel я думал, что MODX можно использовать и как фреймворк для разработки более сложных приложений используя xPDO. Но теперь сравнивая MODX и Laravel могу сказать, что это как копать яму чайной ложкой. Если яма нужна небольшая, то MODX вполне подойдет.
Можно сравнивать и по частям, например, xPDO и Eloquent. Почитав пару страниц руководства про Eloquent и конструктор запросов начинаешь понимать, что xPDO просто крошечная ORM с парой методов, да ещё дырявая в плане безопасности.
Для разработчиков Laravel даёт столько возможностей. В ней используются современные шаблоны и паттерны. А также приёмы разработки и тестирования — composer, npm, testUnit и т.п.
В общем, если нужна CMS с разработкой на уровне сниппетов и плагинов, то MODX вполне сойдёт. Но мне MODX больше не интересен. Чем больше я погружаюсь в Laravel, тем больше ей восхищаюсь. MODX отстаёт по всем позициям. И по некоторым очень сильно.
Если сравнивать Laravel с Yii2, то из беглого знакомства могу сказать, что это фреймворки одного плана. Тут уж что нравится. Популярность Laravel с каждым днём растёт. Единственный минус любого фреймворка — это то, что его нельзя поставить как CMS и сразу работать с сайтом. Но это проблема только для пользователей-администраторов и неопытных разработчиков. Профи могут развернуть готовый сайт-визитку за полчаса.
Из CMS на Laravel мне больше всего понравилась octobercms.com/ а для Yii2 easyiicms.com/. Опять же EasyiiCMS мне показалась более удобной, понятной и функциональной.
Касательно middleware, то у laravel свой подход к их организации и работы (как и в некоторых других местах, и это не всегда в пользу Laravel). Более классическая схема и правильная относительно PSR в Slim 3, который используется в качестве основы в MODX 3 (а мы у себя в рабочем проекте используем уже давно). После некоторого времени работы магия Laravel начинает надоедать и мешать, отнесу это к недостатку, хотя для начинающих это скорее плюс.
Как выше Владимир заметил, есть octobercms и она крута, но мне не нравится, что там таки используется twig, а не классический шаблонизатор и не так легко обновить фреймворк на версию посвежее.
Так всегда бывает когда вырастаешь из продукта. То это не то, то то могло быть лучше. Знания растут, а с ними и требования. Может и я доживу, когда меня магия ларавел будет раздражать. Но я человек не категоричный, поэтому этот момент может и не наступить.
Octobercms щупал. Вполне себе нормальная сиэмэска.
Благодаря Laravel я подтянул свой php и разные стандарты. Это уже новый уровень разработки. Что мне доставляет большое удовольствие. MODX этого не даёт. Как практически любая CMS.