Хочу рассказать вам про серию инструментов для увеличения в несколько раз эффективности разработки и поддержки CRUD-ов. Данные расширения пишу несколько лет и ими никто не пользуется, поскольку похоже их никто не замечает, а чтобы заметили не достаточно просто взять и опубликовать расширение на yiiframework.com. А ведь хочется обратной связи и видеть смысл в продолжении их публикации. Поэтому решил донести до общественности про них здесь.
Разрабатываю на Yii с 2010 года и за это время реализовал несколько объёмных проектов. В процессе работы над ними я постоянно сталкивался с задачей по созданию CRUD-а для очередной таблички в БД. Чтобы это делать требовалось копипастить или генерировать кучу одинакового кода.
С каждым типичным полем вроде выпадающего AJAX-списка требовалось писать один и тот-же функционал:
- Для списка записей:
- Правила валидации.
- Формирование ActiveQuery на основе параметров фильтров
- Настраивать ActiveDataProvider для списка записей
- Формировать настройки колонок списка
- Для формы редактирования
- Правила валидации
- Формировать настройки атрибутов для формы редактирования
- Для модели
- Релейшены
- Объявления виртуальных атрибутов
- Переводы
- Дублирование кода конфигов: настройка валидации типичных полей, колонок, полей формы. Что в результате ведёт к умножению затрат на доработку и поддержку старого сгенерированного кода.
- Дублирование функционала фильтрации и формирования запросов
- Любое изменение структуры БД требует либо перегенерации кода, либо ручного копипаста
- Процесс генерации не особо поддаётся тестированию. Покрыть тестами этот функционал затруднительно. Приходится всё вручную проверять
- Сгенерированный код монолитный и сложно отвязать встречающиеся модули в одном разделе друг от друга
Эта идея постепенно воплотилась в виде расширения execut/yii2-crud-fields. Оно позволяет создать админку для таблиц любой сложности с минимальными затратами и без дублирования кода.
Приведём пример настройки модели для типичного CRUD-а справочника с двумя полями id и name. Это делается несколькими строками в модели без генерации и копипаста, что значительно быстрее стандартного подхода:
Код: Выделить всё
public function behaviors() {
return [
\execut\crudFields\Behavior::KEY => [
'class' => \execut\crudFields\Behavior::class,
'fields' => [
'id' => [
'class' => \execut\crudFields\fields\Id::class,
],
'name' => [
'class' => \execut\crudFields\fields\StringField::class,
'attribute' => 'name',
'required' => true,
]
],
],
];
}
Помимо этого есть расширение execut/yii2-crud, которое автоматизирует вдобавок ещё и процесс настройки контроллеров для CRUD-ов и их навигации, что позволяет уйти от монотонного процесса создания действий и представлений для них, упрощая тем самым вашу работу и проекты в разы.
Подробности про yii2-crud и примеры смотрите тут.
Чтобы увидеть всё в деле сделал оба способа реализации админок по управлению книгами и их авторами в виде пары расширений Yii2. Обычный execut/yii2-books-native и с использованием execut/yii2-crud execut/yii2-books. Там можно увидеть разницу, эффективность и упрощение одного и того-же функционала с помощью yii2-crud-fields. Если сравнить модель авторов, то она в реализации с yii2-crud-fields в 3 раза меньше.
Ещё вдобавок сделал на базе функционала yii2-crud несколько взаимонезависимых модулей для Yii2 и собрал их воедино в виде CMS execut/yii2-cms. Есть пара проектов на её основе. Постоянно дорабатываю эти модули и использую их в разных комбинациях. В ближайшем времени планирую сделать демо-версию.
Более лучших аналогов yii2-crud-fields пока на PHP не встречал (Подскажите, если знаете). Пока есть только на Python, в Django самый удачный вариант увидел. Они похоже пошли той-же дорогой уже давно. Понимаю, что и в yii2-crud-fields есть некоторые недостатки и их нужно допиливать. Но все преимущества инструмента можно ощутить уже сейчас и без этого. Главное попробуйте!