Снова про Laravel Nova , и сравнение с Sharp

Insolita
7 min readJan 13, 2019

Прошло уже довольно много времени с моего первого знакомства с Nova, за это время было выпущено много релизов, закрыто более 900 issue, 3 раза сменилась минорная версия — с 7-го января доступна 1.3.0, а у меня на праздниках выдалось немного времени, чтобы ее опробовать на реальной задаче, а не выдуманных кейсах.

Что изменилось?

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

  • Добавлена поддержка плейсхолдеров для полей
  • В Trix завезли возможность аплоада картинок, хотя и не очень удобную и интуитивную. По сути поле ввода скомбинировали с dropzone и картинку можно загрузить, переместив на нее файл. Но каких-то визуальных ресайзов/кропов из коробки не поддерживается
  • Исправлено много багов локализации (в плане вынесения хардкода в локализируемые переменные ) Но основной баг для языков с падежными окончаниями пока так и не устранен. Для локализации названия ресурса все так же используются только 2 модификации — для единственного и множественного числа, что отлично подходит для английского, и не очень хорошо подходит для многих других. Пока из вариантов — оставаться на английском, подбирать не изменяемые синонимы — аккаунт, вместо пользователь, контент, вместо статья и т.п. либо мириться с некоторой косноязычностью интерфейса.
  • Добавлена поддержка из коробки фильтра по дате, по логическому значению, а так же возможность создания своих полей для фильтрации https://nova.laravel.com/docs/1.0/customization/filters.html#overview
  • Добавлено поле “Подтверждение пароля”
  • В help-методах полей можно использовать html
  • Пофикшена проблема с case-sensitive поиском для postgres
  • Пофикшено много багов с null — отображениями в полях, а так же поддержка nullable для полей-связей
  • В текстовые поля завезли метод asHtml с возможностью отображения форматированного содержания, так например можно легко отобразить кликабельную ссылку
Text::make(__('Url'),'url', function($v){
return sprintf(
'<a href="%s" title="%s" target='__blank'>%s</a>',
$v, $v, Str::limit($v, 25)
)
})->asHtml()->exceptOnForms();

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

Во-первых, это тема с поддержкой респонсивности

Поле для изображения с поддержкой кропа

Загрузка вложений с помощью spatie/laravel-medialibrary

Ппоулярные wysiwyg-редакторы

Менеджер файлов.

В комплекте так же есть поле для загрузки с поддержкой выбора через менеджер

Генератор ресурсов

Визуальный генератор, который позволяет создать новый ресурс (и опционально, модель) по таблице и полям базы с указанием классов полей (поддерживаются только нативные nova-fields)

Must-have — табы

Позволяют сгруппировать длинный список полей в табы, а так же в табах выводить таблицы связанных полей для hasMany/belongsToMany

И альтернативный вариант отображения связей в виде выбора через dropdown от того же разработчика

Помимо сокращения простыни страницы со множеством связей, так же позволяет загружать связанные ресурсы отложенно после выбора

Поле Money-Field

Не только позволяет отформатировать денежное значение и подставить значок валюты, но может сразу адаптировать значение, хранящееся в integer (в копейках/мимнимальной валюте), используя в бекграунде библиотеку moneyphp/money

И еще много готовых плюшек можно найти на nova-packages.com Поле для выбора font-awesome иконок, поля аггрегирующие значения в json, динамическое отображение полей в зависимости от значения выбранного в поле-определителе, билдеры меню и контента, обертки для библиотек управления ролями/полномочиями и бекапами…

Но всё-таки не забывайте перед установкой заглядывать в исходники! Некоторые пакеты достаточно бесполезны, так как решаются простым коллбеком на отображение. Некоторые реализваны слишком хардкодно под узкую задачу и недостаточно кастомизируются.

Так же при разработке, стоит использовать Telescope для отслеживания сколько каких происходит запросов к базе, чтобы не забыть где надо прописать жадную загрузку, или впилить в запрос join

Полезные ссылки:

Еще один русскоязычный обзор Laravel Nova

Серия уроков на laracasts, причем доступных без подписки

Резюмируя, скажу что мнение с прошлого обзора в худшую сторону точно не поменялось :-) Освоившись с концепцией и поковыряв дополнительные пакеты колбасить прототип очень быстро и удобно. Если интересны какие-то более конкретные кейсы с кодом, и практические моменты, чирикните в комментах, на досуге расскажу.

А если давит жаба?

Есть open-source альтернатива со сходной концепцией https://github.com/code16/sharp (возможно, уже и не только она одна, но я других vue-first больше не встречала) Шарп на самом деле появился до анонса Новы. И, несмотря на сходство, реализация всё-таки отличается, что имеет как плюсы, так и минусы.

Прежде всего, Шарп разрабатывался изначально, и разрабатывается с приоритетом на нужды комании-разаботчика.

Документация, хоть и есть, но пока оставляет желать лучшего, некоторые моменты и нюансы в ней не отражены, или отражены не достаточно хорошо. Для полной картины, помимо документации стоит ознакомиться со статьями-примерами и демонстрационным приложением https://github.com/code16/sharp/tree/master/saturn/app

Из интересных преимуществ стоит отметить в первую очередь отвязанность от Eloquent. Можно использовать доктрину, AnalogueOrm или просто query builder. Но из этого, конечно, вытекает, что никакой магии запросов нет, выборки и сохранения придётся писать ручками.

  • Второй момент, это больший контроль над layout. Можно задавать размер колонок для индексных страниц, можно очень гибко группировать поля в строки, а так же разделять на табы из коробки
  • Более простое добавление элементов в меню — просто через конфиг файл.
  • Нет проблем с локализацией
  • Из коробки есть обработка изображений с обрезкой
  • Множественные формы в зависимости от какого-либо параметра, условное отображение поля формы
  • Табличное добавление связанных элементов

В целом, набор оперируемых сущностей гораздо скромнее, есть EntityList для генерации таблиц. К нему можно прицепить фильтры, команды

Как и в laravel-nova, для разграничения полномочий доступа используются стандартный файлы политик (policy)

Команды могут быть как для всего списка, так и для конкретной сущности. Как и в laravel nova, команды могут отображать форму с полями для сбора дополнительных параметров. Команды могут куда-нибудь редиректить, отдавать файл на скачивание, выводить информацию в модальном окне, отображать какое-нибудь представление. Так же есть отдельный тип команд -изменений состояния/статуса— entity state, где можно задать список состояний и цвет

Файл-форма позволяет задать список полей для отображения и их разметку расположения, а так же методы с логикой для поиска сущности, сохранения/редактирования и удаления .

Валидация для формы прописывается в привычном для laravel стиле, в отдельном файле, наследнике от SharpFormRequest, в свою очередь базирующемся на стандартном FormRequest и регистрируется в конфиге. Но возможность задать rules прямо для полей, как в nova, отсутствует

В Шарпе нет Линз (Lens), вместо этого предлагается регистрировать сколько угодно EntityList, или разруливать с помощью фильтров, так как нет никакой магии и завязки на конкретные аттрибуты модели, ничто не мешает добавить фильтр — выбор режима и конструировать запрос на отображение с его учетом.

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

Главная ложка дёгтя — это отсутствие Details. Разаботчик почему-то абсолютно убежден, что формы редактирования достаточно, и даже если сущность априори нередактируемая, можно выставить поля в readOnly или отображать данные через Html поля. И как дополнительный вариант, для быстрого просмотра предлагается использовать команду которая отобразит view в модальном окне (что реализовано достаточно неудобно, потому что view отображается в iframe и нужно серьезно поковыряться, чтобы отобразить данные в соответствии с общим стилем). Соответственно красивую view — страничку с деталями и со связанными табличками отобразить не получится. Предлагается линковать на связанные ресурсы с предазаданными фильтрами.

Но зато всё opensource — бесплатно, без регистрации и смс. При желании можно форкнуть и допилить. Вот такие пироги.

--

--

Insolita

#php,#yii,#laravel,#javascript, #python,#linux,#archlinux,#vue