Авто-генерируемые модели в виде 2 файлов ActiveRecord

Выкладываем свои наработки
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

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

Давно хотел сделать, но нашёл расширение https://github.com/schmunk42/yii2-giiant
В общем то что я хотел, но расширение заброшено на начальном этапе да и сама реализация предполагает постоянную поддержку расширения.
В связи с этим я всё таки решил сам реализовать эту идею, написав небольшое расширение...

https://github.com/mj4444ru/yii2-gii

Мне вот интересно почему такой подход не получил должной поддержки? В нём есть какие то серьёзные минусы?
Кто что может сказать на эту тему?


Отличия от стандартного генератора
----------------------------------
- Дополнительный класс модели для пользовательского кода
- Автогенерация валидаторов для значений по умолчанию
- Автогенерация валидаторов для полей enum (возможно частичное/полное отключение)
- Автогенерация констант для полей enum и set
- Автогенерация behaviors для моделей содержащих поля обрабатываемые TimestampBehavior
- Таблица 'migration' исключается из автогенерации (настраивается)
- Возможно настроить список игнорируемых таблиц
- Полностью переработано создание имён для связей
Последний раз редактировалось mj4444 2015.06.25, 12:25, всего редактировалось 2 раза.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c »

1) > но расширение заброшено на начальном этапе
я смотрю - последний коммит день назад. Как это заброшено?

2) > Мне вот интересно почему такой подход не получил должной поддержки? В нём есть какие то серьёзные минусы?
сейчас работаю на проекте, где как раз используется подобный подход. Сначала мне показалось что плюсы есть, потом понял что плюсов нет вообще. Один гемор. Экономия времени вообще минимальная. А валидацию в любом случае приходится переписывать в пользовательском классе с нуля.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

mj4444 писал(а):Мне вот интересно почему такой подход не получил должной поддержки?
какой подход и от кого поддержки?
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

zelenin писал(а):
mj4444 писал(а):Мне вот интересно почему такой подход не получил должной поддержки?
какой подход и от кого поддержки?
В штатном генераторе сделали галочку для генерации отдельных активквери, а для отдельного активрекорда нет... Хотя там делать то через штатный 10 строк кода...
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

S c писал(а):1) > но расширение заброшено на начальном этапе
я смотрю - последний коммит день назад. Как это заброшено?

2) > Мне вот интересно почему такой подход не получил должной поддержки? В нём есть какие то серьёзные минусы?
сейчас работаю на проекте, где как раз используется подобный подход. Сначала мне показалось что плюсы есть, потом понял что плюсов нет вообще. Один гемор. Экономия времени вообще минимальная. А валидацию в любом случае приходится переписывать в пользовательском классе с нуля.
1) Все коммиты там касательно "crud"... А я сейчас не о нём...

2) В чём гемор? Каким образом используется подобный подход? Конечно если использовать стандартный генератор, то гемора конечно не меньше будет...
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c »

Давайте сразу сэкономим наше время. Скажите лучше вы, каким образом вы рекомендуете подобный подход? Какие вы видите плюсы? Может я не уловил главное предназначение такого подхода. Спасибо
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

S c писал(а):Давайте сразу сэкономим наше время. Скажите лучше вы, каким образом вы рекомендуете подобный подход? Какие вы видите плюсы? Может я не уловил главное предназначение такого подхода. Спасибо
В том что перегенерировать модель можно после добавления в неё функционала... Сейчас в модель вносятся правки и автогенератор становится бесполезным...
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c »

Зачем перегенерировать модель вообще нужно? Это может быть полезно только на самом раннем этапе разработке, когда структура БД сильно меняется (и то, в идеале перед стартом разработки проекта хорошо продумывается архитектура БД, в итоге если все хорошо продумано - модель и БД уже не будут сильно изменятся). А добавить новое поле\связь - это ровно 30 секунд дела. Я больше потрачу на перепроверку, не сломалось ли что то, от автоматически созданного дополнительного правила валидации. Вручную я добавлю то что мне нужно только туда, где мне нужно.

Поправьте если я не прав, или опять же не уловил что то.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

S c писал(а):Зачем перегенерировать модель вообще нужно? Это может быть полезно только на самом раннем этапе разработке, когда структура БД сильно меняется (и то, в идеале перед стартом разработки проекта хорошо продумывается архитектура БД, в итоге если все хорошо продумано - модель и БД уже не будут сильно изменятся). А добавить новое поле\связь - это ровно 30 секунд дела. Я больше потрачу на перепроверку, не сломалось ли что то, от автоматически созданного дополнительного правила валидации. Вручную я добавлю то что мне нужно только туда, где мне нужно.

Поправьте если я не прав, или опять же не уловил что то.
В идеале так... На практике получается иначе... Добавили новую модель, надо менять все связанные модели... Ну конечно если вы связи базы не используете и пишете их сами, вам это не понять (это не личное)...

Ну и опять же где то что то можно пропустить, напутать... Опять же всё это надо проверять что бы исключить предыдущее, что не актуально в случае автоматической генерации...
Последний раз редактировалось mj4444 2015.06.09, 13:42, всего редактировалось 2 раза.
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

zelenin писал(а):аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.
Все правила достаточно стандартны и можно их сгенерировать автогенератором... Ну по крайней мере я с другими не сталкивался... Но если они всё же есть, их можно добавить во второй класс...
Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

mj4444 писал(а):
zelenin писал(а):аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.
Все правила достаточно стандартны и можно их сгенерировать автогенератором... Ну по крайней мере я с другими не сталкивался... Но если они всё же есть, их можно добавить во второй класс...
Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
любая валидация, которую нельзя сгенерировать на основе БД
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c »

>Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
"enum" валидация. Когда (например) статусы хранятся в константах, я всегда добавляю range валидатор для статуса. Все статусы принципиально храню в константах, а не в БД (enum\set тип какой нить).

Еще ситуация когда стандартные автоматические валидаторы начинают ломать что то.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

S c писал(а):>Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
"enum" валидация. Когда (например) статусы хранятся в константах, я всегда добавляю range валидатор для статуса. Все статусы принципиально храню в константах, а не в БД (enum\set тип какой нить).
это правильно.
Или когда range складывается из строк БД различной сложности
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

S c писал(а):>Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
"enum" валидация. Когда (например) статусы хранятся в константах, я всегда добавляю range валидатор для статуса. Все статусы принципиально храню в константах, а не в БД (enum\set тип какой нить).

Еще ситуация когда стандартные автоматические валидаторы начинают ломать что то.
Валидация set / enum была как раз одним из поводов к написанию этого и сейчас это уже есть...
Константы так же добавляются этим расширением...

На счёт ломать - это редкие частные случае которые не являются собственно проблемой и понятны сразу...

Расширение нужно чтобы облегчить работу, а не сделать её полностью за вас... Думать всегда надо...
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

Научил расширение автоматически обновлять комменты в файлах дополнительного кода

Примеры файлов

Код: Выделить всё

<?php

namespace common\models;

use Yii;

/**
 * This is the model class for table "{{%bonuses}}".
 *
 * @property integer $id
 * @property integer $user_id
 * @property integer $created_at
 * @property string $operation
 * @property integer $quantity
 * @property string $comment
 * @property integer $event_schedule_id
 * @property integer $event_reservation_id
 */
class BonusesBase extends \yii\db\ActiveRecord
{
    const OPERATION_ADD = 'add';
    const OPERATION_DEDUCTION = 'deduction';
    const OPERATION__VALUES = ['add', 'deduction'];

    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%bonuses}}';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['user_id', 'operation', 'quantity', 'comment'], 'required'],
            [['user_id', 'quantity', 'event_schedule_id', 'event_reservation_id'], 'integer'],
            [['operation', 'comment'], 'string'],
            [['operation'], 'in', 'range' => [BonusesBase::OPERATION_ADD, BonusesBase::OPERATION_DEDUCTION]]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'user_id' => Yii::t('app', 'User ID'),
            'created_at' => Yii::t('app', 'Created At'),
            'operation' => Yii::t('app', 'Operation'),
            'quantity' => Yii::t('app', 'Quantity'),
            'comment' => Yii::t('app', 'Comment'),
            'event_schedule_id' => Yii::t('app', 'Event Schedule ID'),
            'event_reservation_id' => Yii::t('app', 'Event Reservation ID'),
        ];
    }

    /**
     * @inheritdoc
     * @return BonusesQuery the active query used by this AR class.
     */
    public static function find()
    {
        return new BonusesQuery(get_called_class());
    }

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            \yii\behaviors\TimestampBehavior::className()
        ];
    }
} 

Код: Выделить всё

<?php

namespace common\models;

use Yii;

/**
 * This is the model class for table "{{%bonuses}}".
 *
 * @property integer $id
 * @property integer $user_id
 * @property integer $created_at
 * @property string $operation
 * @property integer $quantity
 * @property string $comment
 * @property integer $event_schedule_id
 * @property integer $event_reservation_id
 */
class Bonuses extends BonusesBase
{
} 
Последний раз редактировалось mj4444 2015.06.09, 19:34, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

для массива однородных констант сделайте геттер - будет полезен и в валидации и во вьюшках
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

zelenin писал(а):для массива однородных констант сделайте геттер - будет полезен и в валидации и во вьюшках
Так то мысли на эту тему были...
Можно пример как должно выглядеть?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin »

Код: Выделить всё

public static function getStatus($id = null)
    {
        $statuses = [
            self::STATUS_ACTIVE => Module::t('Active'),
            self::STATUS_INACTIVE => Module::t('Inactive'),
            self::STATUS_BANNED => Module::t('Banned')
        ];
        if ($id !== null) {
            return ArrayHelper::getValue($statuses, $id, null);
        }
        return $statuses;
    } 
mj4444
Сообщения: 41
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 »

zelenin писал(а):

Код: Выделить всё

public static function getStatus($id = null)
    {
        $statuses = [
            self::STATUS_ACTIVE => Module::t('Active'),
            self::STATUS_INACTIVE => Module::t('Inactive'),
            self::STATUS_BANNED => Module::t('Banned')
        ];
        if ($id !== null) {
            return ArrayHelper::getValue($statuses, $id, null);
        }
        return $statuses;
    }
Получилось в итоге так:

Код: Выделить всё

    public function enumValues($field = null)
    {
        $consts = [
            'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION]
        ];
        if (is_null($field)) {
            return $consts;
        }
        return isset($const[$field]) ? $const[$field] : [];
    }
Последний раз редактировалось mj4444 2015.06.09, 22:41, всего редактировалось 1 раз.
Ответить