Страница 1 из 3

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

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

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

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

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


Отличия от стандартного генератора
----------------------------------
- Дополнительный класс модели для пользовательского кода
- Автогенерация валидаторов для значений по умолчанию
- Автогенерация валидаторов для полей enum (возможно частичное/полное отключение)
- Автогенерация констант для полей enum и set
- Автогенерация behaviors для моделей содержащих поля обрабатываемые TimestampBehavior
- Таблица 'migration' исключается из автогенерации (настраивается)
- Возможно настроить список игнорируемых таблиц
- Полностью переработано создание имён для связей

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

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

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

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

Добавлено: 2015.06.08, 23:38
zelenin
mj4444 писал(а):Мне вот интересно почему такой подход не получил должной поддержки?
какой подход и от кого поддержки?

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

Добавлено: 2015.06.09, 09:01
mj4444
zelenin писал(а):
mj4444 писал(а):Мне вот интересно почему такой подход не получил должной поддержки?
какой подход и от кого поддержки?
В штатном генераторе сделали галочку для генерации отдельных активквери, а для отдельного активрекорда нет... Хотя там делать то через штатный 10 строк кода...

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

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

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

2) В чём гемор? Каким образом используется подобный подход? Конечно если использовать стандартный генератор, то гемора конечно не меньше будет...

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

Добавлено: 2015.06.09, 11:21
S c
Давайте сразу сэкономим наше время. Скажите лучше вы, каким образом вы рекомендуете подобный подход? Какие вы видите плюсы? Может я не уловил главное предназначение такого подхода. Спасибо

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

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

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

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

Поправьте если я не прав, или опять же не уловил что то.

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

Добавлено: 2015.06.09, 12:05
zelenin
аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.

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

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

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

Ну и опять же где то что то можно пропустить, напутать... Опять же всё это надо проверять что бы исключить предыдущее, что не актуально в случае автоматической генерации...

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

Добавлено: 2015.06.09, 13:38
mj4444
zelenin писал(а):аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.
Все правила достаточно стандартны и можно их сгенерировать автогенератором... Ну по крайней мере я с другими не сталкивался... Но если они всё же есть, их можно добавить во второй класс...
Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...

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

Добавлено: 2015.06.09, 14:09
zelenin
mj4444 писал(а):
zelenin писал(а):аналогично думаю. gii не пользуюсь, т.к.скопипастить по времени быстрее, а правила валидации все равно надо проверять и дополнять.
Все правила достаточно стандартны и можно их сгенерировать автогенератором... Ну по крайней мере я с другими не сталкивался... Но если они всё же есть, их можно добавить во второй класс...
Приведите пример реального использования валидации которую нельзя сгенерировать автоматически...
любая валидация, которую нельзя сгенерировать на основе БД

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

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

Еще ситуация когда стандартные автоматические валидаторы начинают ломать что то.

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

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

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

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

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

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

Расширение нужно чтобы облегчить работу, а не сделать её полностью за вас... Думать всегда надо...

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

Добавлено: 2015.06.09, 16:43
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
{
} 

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

Добавлено: 2015.06.09, 16:45
zelenin
для массива однородных констант сделайте геттер - будет полезен и в валидации и во вьюшках

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

Добавлено: 2015.06.09, 17:39
mj4444
zelenin писал(а):для массива однородных констант сделайте геттер - будет полезен и в валидации и во вьюшках
Так то мысли на эту тему были...
Можно пример как должно выглядеть?

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

Добавлено: 2015.06.09, 17:41
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;
    } 

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

Добавлено: 2015.06.09, 19:25
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] : [];
    }