Всем привет. Расскажу про генератор CRUD для Laravel. Для студенческой работы мне нужно было сделать много CRUD-форм, последний раз, когда у меня была такая задача (в 2017 году), я использовал Yii2 и Gii. В этот раз я решил сделать решение на базе Laravel, но в Laravel не поставили свой встроенный GUI-генератор, поэтому пришлось искать «стороннее» решение.
Google вернул четыре варианта, первый из них был CRUDBooster , я бился с ним пару часов, ничего не произошло, код сгенерировался, GUI не было.
Дальше было Создаваемый , с этим другом мне тоже пришлось повозиться, даже просто чтобы его установить, но он сгенерировал какой-то GUI и я решил остановиться на этом варианте.
Ниже я расскажу о работе с Craftable и покажу пару скриншотов GUI.
Начало работы с Craftable
После установки обязательно выполните команды (в корневом каталоге проекта):И после каждого изменения ресурсов в JS-части («resources/js») нужно запускать команду:npm install && npm run dev
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%/)
- Переводы всех подписей
- Классы для «заполнения» записей тестовой базы данных
Хотя Craftable генерирует записи в таблице разрешений, в панели администратора нет страницы для управления этими разрешениями.
Без этого управлять разрешениями ролей не удобно, но генерировать разрешения, конечно, вообще нельзя.
После создания модели выполняем: npm run dev
Эта команда не выполняется автоматически.
Подробнее о генерации в документации .
Посмотреть список
Просмотр для создания записи
Редактирование вида
Типы данных
Таблицу для генерации CRUD удобно создавать с помощью миграции, поскольку Craftable генерирует представления и правила проверки параметров формы на основе типа столбца, тогда как такие столбцы, как десятичные, не поддерживаются и будут игнорироваться.То есть если вам нужен «нестандартный» столбец, например с «десятичным» типом, то:
- Мы выполняем миграцию, чтобы создать столбец, мы используем «integer()»,
- создать модель,
- откатить миграцию,
- при миграции в описании таблицы замените «integer()» на «decimal()»,
- Давайте реализуем миграцию.
Поддерживаемые типы:
- нить
- текст
- дата
- дата и время
- время
- логическое значение
Переводы
По умолчанию доступен только один язык, а в админ-панели нет возможности добавить еще один язык для переводов.Чтобы добавить другой язык, вам нужно открыть файл «/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, а именно:- index.js
- Листинг.
js
- Форма.
js
<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
-
Каким Walmart Видит Супермаркет Будущего
19 Oct, 24 -
Podthings, Выпуск 125
19 Oct, 24 -
Новые Типы Файлов В Google Docs
19 Oct, 24 -
Первый Белорусский Ноутбук
19 Oct, 24 -
Блоглайны Полностью Переработаны
19 Oct, 24