Yii2 Magic Scopes

Выкладываем свои наработки
Ответить
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Yii2 Magic Scopes

Сообщение phpshko »

Yii2 Magic Scopes - это поведение которое позволяет использовать "магические скоупы".

Например:

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

UserWith::find()
                ->andId(45)
                ->orUsernameLike('php')
                ->orYearBetween(1980, 2000)
                ->orAddressIdMore(10);
 
вместо

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

UserWithout::find()
                ->andWhere(['id' => 45])
                ->orWhere(['like', 'username', 'php'])
                ->orWhere(['between', 'year', 1980, 2000])
                ->orWhere(['>', 'address_id', 10]);
 
Весь список доступных методов, в конце ReadMe, а больше примеров можно посмотреть в этом тесте

Можно с помощью Gii сгенерировать модель, и если выставить галочку "Generate Magic Scopes", то будет автоматический подключен behavior, и создан DocBlock для автокомплита этих методов

Изображение

Можно подключать в своих Query, пример есть на гитхабе.

Возможно пригодиться тем, кто не хочет ради банальных скоупов создавать например UserQuery, или нужен автокомплит.

Хотелось бы услышать конструктивную критику, и может какие-то советы на будущее.
Так же интересует, может у кого-то есть идеи, как избежать такого количества строк в DocBlock, но чтобы автокомплит работал.
Заранее спасибо.

GitHub
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Yii2 Magic Scopes

Сообщение lynicidn »

зачем вам свой квери? https://github.com/phpshko/yii2-magic-s ... eQuery.php
сделайте parent::find() и атачьте на стандартный квери бехавиор
phpshko
Сообщения: 260
Зарегистрирован: 2015.03.21, 02:49

Re: Yii2 Magic Scopes

Сообщение phpshko »

Залил версию 0.1.0
Вынес в отдельный пункт в Gii генераторе, чтобы не было конфликтов.
Добавил 3 метода подключения поведения:
1) Use Magic Query - как и раньше

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

public static function find()
    {
        return new MagicActiveQuery(get_called_class());
    }
2) Create Query - создает класс query для этой модели, в котором подключается поведение, и потом его подключаю в самой модели.

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

...
 * @method UserWithCreateQuery|UserWithCreate orAddressIdNotLess($than, $include = false)
 * @method UserWithCreateQuery|UserWithCreate orAddressId($addressId)
 *
 */
class UserWithCreateQuery extends \yii\db\ActiveQuery
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => \phpshko\magicscopes\MagicScopesBehavior::className()
            ]
        ];
    }
}

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

class UserWithCreate extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     * @return UserWithCreateQuery|UserWithCreate
     */
    public static function find()
    {
        return new UserWithCreateQuery(get_called_class());
    }
3) Attach Behavior - тот вариант что предложил lynicidn

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

    public static function find()
    {
        $query = parent::find();
        $query->attachBehavior('MagicScopesBehavior', MagicScopesBehavior::className());
        return $query;
    }
 
Добавлена возможность сохранять PhpDoc как в модели, так и в MagicAutoComplete.php, для того чтобы не засорять модель. Будет сохранен рядом с моделью. PhpDoc мержиться со старыми записями.

Тестами покрыты разные варианты генерации моделей.
Планирую подключить TravisCI, сделать страничку с более наглядным ридми, и причесать код, и возможно функцию обновления только phpdoc, чтобы при изменении модели можно было просто их обновить, и даже простая инспекция IDE будет указывать на битые методы.
Буду рад конструктивной критики, советам, сообщениям о багах или неточностях.

GitHub
Ответить