Craftable — Генератор Crud Laravel

Всем привет. Расскажу про генератор CRUD для Laravel. Для студенческой работы мне нужно было сделать много CRUD-форм, последний раз, когда у меня была такая задача (в 2017 году), я использовал Yii2 и Gii. В этот раз я решил сделать решение на базе Laravel, но в Laravel не поставили свой встроенный GUI-генератор, поэтому пришлось искать «стороннее» решение.

Google вернул четыре варианта, первый из них был CRUDBooster , я бился с ним пару часов, ничего не произошло, код сгенерировался, GUI не было.

Дальше было Создаваемый , с этим другом мне тоже пришлось повозиться, даже просто чтобы его установить, но он сгенерировал какой-то GUI и я решил остановиться на этом варианте.

Ниже я расскажу о работе с Craftable и покажу пару скриншотов GUI.



Начало работы с Craftable

После установки обязательно выполните команды (в корневом каталоге проекта):
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

npm install && npm run dev

И после каждого изменения ресурсов в JS-части («resources/js») нужно запускать команду:

npm run dev

При выполнении этой команды создаются новые бандлы для JS и CSS («public/js/admin.js» и «public/css/admin.css»), лучше сразу добавить файлы бандлов в «.

gitignore», так как эти файлы генерируются автоматически, и вести историю их изменений нет смысла.



Вход в админ панель

Вы можете использовать встроенную учетную запись администратора, имя «[email protected]», пароль ищите в скрипте миграции («protected $password = 'PjucggYEOK';») «database/migrations/2020_03_24_214249_fill_default_admin_user_and_permissions.php» , часть имени файла «2020_03_24_214249_» у вас будет другая.

Вы можете зарегистрировать нового пользователя, используя регистрацию из ящика Laravel. После этого зайдите в админ-панель «/admin», в меню выберите «Управление доступом» («/admin/admin-users») и разрешите доступ к админ-панели для новой учетной записи.



Как работает генерация

Создаем таблицу базы данных, скажем «посты» и выполняем команду:

php artisan admin:generate posts

Craftable сгенерирует для нас:
  • Модель
  • Контроллер
  • Классы FormRequest для всех действий, где требуется обработка данных формы
  • Таблица с разрешениями действий и соответствующими проверками в контроллере
  • Просмотр шаблонов для всех действий CRUD (/resources/views/admin/%your-table-name%/)
  • Переводы всех подписей
  • Классы для «заполнения» записей тестовой базы данных
Также в метод контроллера index() будет добавлен код фильтрации значений базы данных, это очень удобно — если он не нужен, то его не сложно выкинуть; если нужно, то уже есть место, куда прописать логику фильтрации.

Хотя Craftable генерирует записи в таблице разрешений, в панели администратора нет страницы для управления этими разрешениями.

Без этого управлять разрешениями ролей не удобно, но генерировать разрешения, конечно, вообще нельзя.

После создания модели выполняем:

npm run dev

Эта команда не выполняется автоматически.

Подробнее о генерации в документации .



Посмотреть список



Craftable — генератор CRUD Laravel



Craftable — генератор CRUD Laravel



Просмотр для создания записи



Craftable — генератор CRUD Laravel



Редактирование вида



Craftable — генератор CRUD Laravel



Типы данных

Таблицу для генерации CRUD удобно создавать с помощью миграции, поскольку Craftable генерирует представления и правила проверки параметров формы на основе типа столбца, тогда как такие столбцы, как десятичные, не поддерживаются и будут игнорироваться.

То есть если вам нужен «нестандартный» столбец, например с «десятичным» типом, то:

  1. Мы выполняем миграцию, чтобы создать столбец, мы используем «integer()»,
  2. создать модель,
  3. откатить миграцию,
  4. при миграции в описании таблицы замените «integer()» на «decimal()»,
  5. Давайте реализуем миграцию.

В результате мы имеем и сгенерированный CRUD, и таблицу с необходимыми типами данных.

Поддерживаемые типы:

  • нить
  • текст
  • дата
  • дата и время
  • время
  • логическое значение


Переводы

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

Чтобы добавить другой язык, вам нужно открыть файл «/config/translatable.php» и добавить нужный язык.

Язык интерфейса выбирается в профиле пользователя.

Craftable генерирует переводы для всех подписей и сообщений, это с одной стороны круто, но с другой не очень.

Впервые в моих взглядах появились замены переводов:

trans('admin.wood-specie.actions.index')

и сами переводы:

'wood-specie' => [ 'title' => 'Wood Specie', 'actions' => [ 'index' => 'Wood Specie', 'create' => 'New Wood Specie', 'edit' => 'Edit :name', ], 'columns' => [ 'id' => 'ID', 'title' => 'Title', 'calculation_period' => 'Calculation period', 'timber_harvesting_age' => 'Timber harvesting age', 'main_harvesting_age' => 'Main harvesting age', ], ],

И это было очень круто! А вот для остальных страниц в представлениях генерировались замены, но сами переводы не генерировались (возможно потому, что когда я генерировал первую модель, был указан только один язык, а когда генерировал остальные страницы, языков было уже два) .

Поэтому мне пришлось открывать в меню «Переводы» (/admin/translations) и делать переводы вручную; если кодов для перевода нет, то нужно нажать кнопку «Пересканировать переводы» или выполнить команду:

php artisan admin-translations:scan-and-save

Когда переводы сгенерированы в файл, их можно сохранить в репозитории; при создании переводов через «Пересканирование переводов» они записываются в базу данных и вам придется их выкатывать (при развертывании нового «сервера») SQL-скриптом (или писать скрипт для генерации файла с переводами из записей базы данных).

Подробнее о локализации в документации.

.



Использование Vue

Craftable генерирует JS-скрипты для рендеринга на стороне клиента с использованием Vue, а именно:
  1. index.js
  2. Листинг.

    js

  3. Форма.

    js

Если вам не нужны представления списка (Listing.js) или отдельных сообщений (Form.js), вы можете удалить соответствующий файл и внести изменения в index.js. Поскольку Vue получает наши шаблоны представлений как часть компонента, теги не требуются.



<script>

не должно быть в шаблоне, а весь JS-код должен находиться в соответствующем файле.

Если мы добавим какое-то свойство в нашу модель и не будем принудительно генерировать:

php artisan admin:generate --force posts

затем нам нужно вручную добавить это новое свойство в Form.js.

Использование множественного выбора

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

Этот пример мне сразу не помог.

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

<multiselect v-model="form.bonitet" :options="$attrs.bonitets" :multiple="false" :searchable="false" :allow-empty="false" track-by="id" label="title" tag-placeholder="{{ __('Выбрать Бонитет') }}" placeholder="{{ __('Кредит') }}"> </multiselect>

В примере из документации не используется $attrs, но без него мой компонент имел пустой список.

Если мы открываем страницу редактирования существующей записи, то для того, чтобы в выпадающем списке было выбрано текущее значение, нам необходимо установить это значение на стороне сервера (PHP):

public function edit(ForestResource $forestResource) { $this->authorize('admin.forest-resource.edit', $forestResource); $bonitet = $forestResource->bonitet()->get()[0]; $forestResource->bonitet = $bonitet; return view('admin.forest-resource.edit', [ 'forestResource' => $forestResource, 'specieTitle' => $forestResource->woodSpecie()->get()[0]->title, 'timberClassTitle' => $forestResource->timberClass()->get()[0]->title, 'bonitets' => Bonitet::all(), ]); }

Ключевые строки:

$bonitet = $forestResource->bonitet()->get()[0]; $forestResource->bonitet = $bonitet;

Конечно, в вашей модели должно быть определено отношение bonitet():

public function bonitet() { return $this->belongsTo(Bonitet::class); }



Кастомизация



Представление

Часть представлений, например меню администратора, будет расположена в ресурсах «resources/views/admin/layout/sidebar.blade.php», другие части представления будут взяты из исходников самого Craftable — «vendor /brackets/admin-ui/resources/views/admin/partials/header.blade.php." Соответственно, если мы хотим переделать эти части дизайна, то копируем шаблоны представлений из исходного кода Craftable и меняем " ссылки», это было:

@extends('brackets/admin-ui::admin.layout.default')

стал:

@extends('admin.layout.default')



Маршруты

Все маршруты, которые добавляет Craftable, потребуют проверки на роль «admin», будут иметь префикс «admin/» и пространство имен «Admin»:

/* Auto-generated admin routes */ Route::middleware(['auth:' .

config('admin-auth.defaults.guard'), 'admin'])->group(static function () { Route::prefix('admin')->namespace('Admin')->name('admin/')->group(static function() { Route::prefix('cutting-areas')->name('cutting-areas/')->group(static function() { Route::get('/','CuttingAreaController@index')->name('index'); }); }); });

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



Заключение

Мне было комфортно работать с Craftable. Репозиторий с примерами использования Craftable В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Используете ли вы автоматическую генерацию кода? 27.27% Нет такой необходимости 6 36.36% Все пишу сам 8 0% Я уже использую Craftable или другой инструмент 0 27.27% Буду использовать Craftable 6 9.09% Буду использовать, но точно не Craftable 2 Проголосовали 22 пользователя.

12 пользователей воздержались.

Теги: #php #Laravel #CMS

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.