Laravel Nova и Laravel Backpack: сравнение и обзор возможностей

Предлагаю ознакомиться с моим вариантом перевода статьи Laravel Nova vs Laravel Backpack: a review of the features. Если вы видите какие-либо ошибки, не стесняйтесь комментировать, я исправлю это.

Может ли Laravel Nova стать преемником Laravel Backpack? Являются ли эти два продукта взаимодополняющими? Давайте сравним их.

Релиз Laravel Nova состоялся в конце августа 2018 года, и принят Laravel-сообществом с большим интузиазмом, даже несмотря на то,  что этот продукт платный. Я сразу же купил его, чтобы посмотреть и изучить его. Сможет ли Nova заменить мне Laravel Backpack? Я тестировал также другие продукты в категории «admin panel», такие как Laravel Voyager или Laravel Admin Architect, но мой выбор всегда останавливался на Backpack. В этот раз я был уверен, что Nova будет хорошим конкурентом.

Установка Laravel Nova и первые впечатления

Установка обоих продуктов проста. У меня не возникло проблем, даже в первый раз. Дефолтный дизайн Laravel Nova намного красивее, чем у Laravel Backpack, но так как это настраиваемая опция, это не имеет большого значения.

Laravel Nova — страница авторизации

Единственная вещь, которая удивила меня в Nova, —  это отсутствие ссылки на страницу входа с главной страницы. Наверное так даже лучше, поскольку это панель администратора, а не пользовательский кабинет.

Backpack Crud и Nova Crud: два разных подхода

Чтобы создать CRUD в Nova, нужно создать класс «Resource» содержащий в себе всю конфигурацию CRUD. После описания этого класса всё остальное делается автоматически:

  • Пункт добавляется в меню сайдбара
  • Настройка роутинга
  • Можно отобразить записи в списке таблиц, а также форму для ввода данных

Короче говоря, рабочий CRUD для модели готов. Круто!

Загрузка этих ресурсов производится в Laravel Nova автоматически при условии, что ваши классы находятся в директории app/Nova. К счастью, Nova имеет ручной механизм загрузки классов, которые можно настроить независимо от местоположения файлов. Это очень важная функция, так как простое сканирование единственной директории не даёт возможности использования другого проекта приложения, такого как модульная, с использованием Laravel-модулей Nwidart. Эта проблема присутствует в других проектах для создания панелей администратора, например, в AdminArchitect, где я не нашел способ добавить каталоги, откуда загружать классы CRUD.

С другой стороны, Laravel Backpack ничего не сканирует. Вы должны использовать свои ресурсы (называемые CrudControllers) как все остальные контроллеры: вам нужно настроить маршрут вручную и установить элемент в меню.

Итак, у нас есть два разных подхода: философия Nova состоит в том, чтобы выполнять как можно больше вещей в фоновом режиме, что может повлиять на её гибкость, в то время как Backpack является более кастомизируемым и легко настраиваемым.

Навигация в Laravel Nova

Laravel Backpack предоставляет меню навигации, которое вы можете полностью настроить, непосредственно, отредактировав файл с представлением (sidebar_content.blade.php):

<li>
   <a href=”{{ backpack_url(‘documents’) }}”>
      <i class=”fa fa-files-o”></i>
      <span>@lang(‘Documents’)</span>
   </a>
</li>

Laravel Nova автоматически добавляет пункт меню для каждого найденного ресурса, и упорядочивает по алфавиту:

@foreach (Nova::availableResources(request()) as $resource)
<li class=”leading-wide mb-4 text-sm”>
[... menu code ...]
</li>
@endforeach

Но не беспокойтесь, вы можете легко создать файл resources/navigation.blade.php в директории views, чтобы настроить навигацию именно так, как вы хотите.

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

Табличное отображение данных

Во-первых, посмотрите на два скриншота: один с Laravel Backpack с моделью под названием Vulnerability и один с Nova и модель под названием Document.

Laravel Backpack — Crud List view

Laravel Nova — Crud List view

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

Nova не имеет функции экспорта

С Laravel Nova вы не можете экспортировать данные из списка. Я был очень удивлён, увидев это, я думаю, что это важная функция. Конечно, вы можете запрограммировать это самостоятельно, добавив дополнительый «action» с требуемым функционалом.

Nova: добавление дополнительных действий

Laravel Backpack: имеет нативную поддержку экспорта данных

Backpack Laravel: выбор нескольких строк

В Backpack по-прежнему нет никакого способа выбирать несколько строк и применять к ним действия (например, удаление). Однако, разработчики анонсировали патч для реализации этой функции.

Фильтрация данных лучше в Backpack

Мне не нравится вид фильтров в Nova. Чтобы определить собственные фильтры, вам необходимо создать класс фильтра для каждого поля. Кроме того, представление фильтров практически нецелесообразно: всё доступно, нажимая на значок фильтра, и затем отображаются все фильтры. Мне это не нравится, потому что в таблице много пустых мест, и это пространство не используется даже на широком экране.

Фильтры в Nova

Кроме того, вы не можете определить «текстовый» фильтр (вы просто вводите текст для фильтрации строк).

В Backpack фильтры могут быть реализованы с меньшими затратами. Нет необходимости иметь отдельные файлы с классами для каждого фильтра, всё в CrudController:

$this->crud->addFilter([ // dropdown filter
  'name' => 'status',
  'type' => 'dropdown',
  'label'=> 'Status'
], [
  1 => 'In stock',
  2 => 'In provider stock',
  3 => 'Available upon ordering',
  4 => 'Not available',
], function($value) { // if the filter is active
    // $this->crud->addClause('where', 'status', $value);
});

У вас есть несколько типов фильтров (текст, переключатель, селект-бокс и select2, которые представляют собой поля для поиска, фильтра по дате и диапазону дат).

Laravel Backpack — фильтр на базе Select2

Laravel Backpack  — фильтр по диапазону дат

Кроме того, внешний вид фильтров более интуитивно понятен в Backpack:

Laravel Backpack фильтры вверху таблицы

Здесь Laravel Backpack является победителем.

Nova lenses: хорошая концепция

Nova предлагает возможность настраивать пользовательские представления (называемые объективами или lenses) любой таблицы CRUD. Это действительно отличная концепция. Для создания этих объективов есть artisan-команда, и общий результат очень приятный:

Кастомная вьюшка для модели User: показывает самых прибыльных пользователей

В Backpack эта функция не поддерживается напрямую. Лучшим вариантом для этого было бы, использовать фильтры, поскольку они предлагают множество настроек, а функция обратного вызова представляет весь объект CRUD, чтобы вы могли добавлять любой функционал, который вы хотите, а также добавлять и удалять столбцы. Это не было проверено, но на первый взгляд должно работать.

$this->crud->addFilter([ // select2 filter
  'name' => 'status',
  'type' => 'select2',
  'label'=> 'Status'
], function() {
    return [
            1 => 'In stock',
            2 => 'In provider stock',
            3 => 'Available upon ordering',
            4 => 'Not available',
            ];
}, function($value) { // if the filter is active
    $this->crud->addClause('where', 'status', $value);
    $this->crud->addColumn(...) // Should work
    $this->crud->removeColumn(...) // Should work
});

Laravel Backpack: вам нравятся кнопки?

В Backpack вы можете добавить много кнопок. Везде. Над таблицей, под таблицей, в каждой строке и так далее. Каждая кнопка может делать всё, что угодно: переходить на новый роут или выполнять какие-то действия с помощью Javascript/jQuery.

В Nova это пока не поддерживается. Backpack является победителем в этой категории. Это, безусловно, киллер-фича, поскольку мне интересно, как вы можете сделать хорошее приложение, не добавляя дополнительные кнопки.

Настройка формата столбцов

С помощью Backpack вы можете настроить формат содержимого столбца, например, для создания пользовательского условия типа: «если значение равно 1, сделать цвет текста красным». Этого можно достичь с помощью двух разных механизмов:

  • С типом столбца model_function, который вызовет функцию модели для форматирования содержимого столбца.
  • Добавив шаблон Blade, соответствующий столбцу, который вы хотите отформатировать.

Я не являюсь поклонником первого способа, мне всегда кажется странным добавлять функцию модели только для форматирования содержимого, она нарушает принципы MVC.

Что насчет Laravel Nova? Здесь у меня был очень плохой сюрприз. Вы действительно можете форматировать, как хотите, любой столбец с функцией displayUsing. Но с большим ограничением. Вот код:

/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
   return [
      ID::make()->sortable(),
      Text::make(‘Title’)->sortable()->displayUsing(function ($value) {
        // Let's try that!
        return ‘<b>’.strtoupper($value).’</b>’;
       }),
      Textarea::make(‘Description’)->sortable(),
   ];
}

И неожиданный результат:

Nova: кастомизация формата колонки

Это немного удивительно, я думаю, что это ошибка, а не особенность. Слишком много безопасности. Победитель: Backpack.

История изменения: легко с Backpack!

Laravel Backpack предоставляет способ отображения кнопки «ревизий» в каждой строке, что приводит к экрану, отображающему … версии записи:

Laravel Backpack — ревизии вызывают восторг

Laravel Nova вообще не предлагает такую функцию.

Адаптивные таблицы

Просмотр списка CRUD обоих продуктов является отзывчивым. Тем не менее, Backpack добавил интересный вариант, чтобы пользователь мог выбрать, какие столбцы будут скрыты на маленьких экранах.

Предварительный просмотр записей

Nova и Backpack имеют кнопку предварительного просмотра, чтобы показать запись без редактирования.

Формы редактирования и добавления

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

Для форм редактирования / добавления здесь я выделил:

  • Оба продукта поддерживают все виды отношений (1-N и N-N со сводными таблицами).
  • Форма редактирования хороша в обоих продуктах
  • Nova предлагает использование секций с полями ввода, которые очень удобны для длинных форм. Для Backpack большие формы можно реализовать с помощью вкладок.

Field Panel в Laravel Nova удобны для больших форм

Laravel Backpack — формы с табами тоже норм

Правила валидации

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

Text::make(‘Title’)->sortable()->creationRules(‘required’, ‘string’, ‘min:6’),
Textarea::make(‘Description’)->sortable(),

Этот код будет иметь следующую форму:

Laravel Nova: поля, отмеченные как обязательные, не имеют красной звезды

Недавно в Backpack была реализована функция «красных звёзд», и теперь все обязательные поля имеют отличительную черту.

  • Backpack и Nova поддерживают множество типов полей, которых должно быть достаточно для большинства приложений. Кроме того, оба позволяют разработчику создавать настраиваемые поля, поэтому на этом уровне нет проблем.
  • Laravel Nova реализовала очень интересную функцию: автоматическое отображение связанных моделей.

Laravel Nova: автоматическое отображение связанных моделей к записи

Однако не ясно, можно ли его кастомизировать или удалить, поскольку он основан на отношениях моделей.

В Laravel Backpack такая функция недоступна, и вам придётся делать связанные шаблоны для моделей вручную.

Дашборды, карточки и метрики

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

Это хорошая функция, которая должна быть подчеркнута, поскольку это, безусловно, важная и уникальная особенность Laravel Nova.

Laravel Nova график в виде карточки

Laravel Backpack не имеет этой функции, вам придётся разрабатывать её вручную, используя внешние библиотеки и модули для диаграмм. Я думаю, что это один из основных критериев, который убедит многих разработчиков использовать Nova.

Итоги: Nova или Backpack?

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

Чтобы обобщить и помочь вам выбрать между ними, вот плюсы и минусы использования Nova вместо Backpack.

Плюсы:

  • Простой в использовании, чёткий и чистый синтаксис.
  • Панельки / метрики/ карточки
  • Отображаются связанные модели
  • Концепция CRUD-списка пользовательских представлений (объективов)
  • Секции для длинных форм
  • Поддержка выбора нескольких строк

Минусы:

  • Меньше настроек, чем в Backpack
  • Нет функции экспорта
  • Нет условного форматирования столбцов с помощью HTML / CSS
  • Нет пометок для отображения обязательных полей в формах
  • Фильтры менее интуитивно понятны и менее гибки
  • Отсутствие поддержки ревизий
  • Отсутствует способ добавления кнопок
  • Нет настройки адаптивности таблиц

Короче говоря, если ваша панель администратора остается простой, без слишком сложной кастомизации, Laravel Nova может стать отличным выбором, так как это позволит быстро разработать прототип и получить результат. Однако, как только вам понадобится выполнить сложные вещи, Laravel Backpack будет более приспособлен к вашим потребностям.

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

Пока я буду использовать Backpack для своих проектов, но я буду смотреть на Nova, поскольку она может развиваться быстро. Nova не сильно отстаёт от Backpack: с немного более настраиваемыми механизмами и прочими мелочами, это делает Backpack сильным конкурентом с чрезвычайно интересными функциями, оставаясь чистым и юзер-френдли.

Благодарности и отказ от ответственности

Благодаря разработчикам этих двух продуктов и особенно Cristian Tabacitu (Laravel Backpack) за его работу и выгодный план лицензирования. Удачи Taylor Otwell за его новый продукт и благодарность за Laravel и за Nova, которая приносит новые идеи.

Большинство скриншотов из этих статей взяты из страниц руководства обоих продуктов. Автор не связан ни с одним из них.

Если вы видите какие-либо ошибки, не стесняйтесь комментировать, я исправлю это.