• Час читання ~7 хв
  • 08.09.2023

Lift - це пакет, який покращує ваші красномовні моделі в Laravel.

Це дозволяє створювати загальнодоступні властивості в красномовних моделях, які відповідають вашій схемі таблиці. Це полегшує читання та роботу з моделями в будь-якій IDE.

Він забезпечує простий спосіб налаштування ваших моделей, зосереджуючись на простоті та зручності використання за допомогою атрибутів PHP 8.

Пакет залежить від роботи Eloquent Events. Це означає, що пакет легко вписується у ваш проект, не потребуючи серйозних змін (якщо ви не вимкнули ініціювання подій).

У цій публікації давайте глибоко зануримося в Lift і дізнаємося про всі функції, які він надає.

Встановлення Laravel Lift Ви можете встановити пакет за допомогою композитора:

Щоб почати використовувати Lift

composer require wendelladriel/laravel-lift

, вам потрібно додати рису Lift до ваших красномовних моделей, і ви готові до роботи.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;
}

риси

Коли ви додаєте рису Lift до своїх красномовних моделей, ви можете створювати на них загальнодоступні властивості, що полегшує їх розуміння та роботу в будь-якій IDE.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    public $id;

    public $name;

    public $price;
}

Магія відбувається, коли ви починаєте використовувати атрибути, які надає пакет.

Атрибути

класу DB Attribute

Lift надає атрибут, DB який можна використовувати для визначення з'єднання, таблиці та часових міток вашої моделі.

Без ліфта

use Illuminate\Database\Eloquent\Model;

final class Product extends Model
{
    public $timestamps = false;

    protected $connection = 'mysql';

    protected $table = 'custom_products_table';

    // ...
}

З ліфтом

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\DB;
use WendellAdriel\Lift\Lift;

#[DB(connection: 'mysql', table: 'custom_products_table', timestamps: false)]
final class Product extends Model
{
    use Lift;
    // ...
}

Relation Attributes Attributes

Lift надає атрибути для визначення зв'язків між моделями, тому замість того, щоб визначати їх за допомогою методів, ви можете визначити їх як атрибути. Всі атрибути зв'язків приймають ті ж параметри, що і методи.

Без ліфта

// Post.php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

final class Post extends Model
{
    public function comments(): HasMany
    {
        return $this->hasMany(Comment::class);
    }
    // ...
}
// Comment.php
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

final class Comment extends Model
{
    public function post(): BelongsTo
    {
        return $this->belongsTo(Post::class);
    }
    // ...
}

З ліфтом

// Post.php
use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Relations\HasMany;
use WendellAdriel\Lift\Lift;

#[HasMany(Comment::class)]
final class Post extends Model
{
    use Lift;
    // ...
}
// Comment.php
use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Relations\BelongsTo;
use WendellAdriel\Lift\Lift;

#[BelongsTo(Post::class)]
final class Comment extends Model
{
    use Lift;
    // ...
}

Ви можете перевірити всі доступні атрибути зв'язків у документах.

Відносини будуть працювати так само, як якщо б ви визначили їх за допомогою методів.

Атрибути

властивостей Cast Attribute

Lift надає атрибут, Cast який можна використовувати для визначення зліпків властивостей моделі. Окрім відтворення значень, він також дозволяє вводити властивості.

Без ліфта

use Illuminate\Database\Eloquent\Model;

final class Product extends Model
{
    protected $casts = [
        'id' => 'int',
        'name' => 'string',
        'price' => 'float',
        'active' => 'boolean',
        'expires_at' => 'immutable_datetime',
    ];
}

З ліфтом

use Carbon\CarbonImmutable;
use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Cast('string')]
    public string $name;

    #[Cast('float')]
    public float $price;

    #[Cast('boolean')]
    public bool $active;

    #[Cast('immutable_datetime')]
    public CarbonImmutable $expires_at;
}

Column Attribute

Lift надає атрибут, Column за допомогою якого можна налаштувати назву стовпця властивостей моделі та визначити для них значення за замовчуванням.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Column;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Cast('string')]
    #[Column('product_name')]
    public string $name;

    #[Cast('float')]
    #[Column(name: 'product_price', default: 0.0]
    public float $price;
}

У наведеному вище name прикладі властивість буде зіставлено зі стовпцем, а властивість price – зі product_name product_price значенням 0.0за промовчанням .

Можна навіть передати ім'я функції значенню за промовчанням, яке викликатиметься під час збереження властивості в базі даних.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Column;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Cast('string')]
    #[Column('product_name')]
    public string $name;

    #[Cast('float')]
    #[Column(name: 'product_price', default: 0.0]
    public float $price;

    #[Cast('float')]
    #[Column(default: 'generatePromotionalPrice')]
    public float $promotional_price;

    public function generatePromotionalPrice(): float
    {
        return $this->price * 0.8;
    }
}

Атрибут

, придатний для заповнення Lift При використанні ознаки всі атрибути вашої моделі встановлюються під охорону. Ви можете використовувати Fillable атрибут, щоб визначити, які властивості можуть бути масово призначені.

Без ліфта

use Illuminate\Database\Eloquent\Model;

final class Product extends Model
{
    protected $fillable = [
        'name',
        'price',
    ];
    protected $casts = [
        'id' => 'int',
        'name' => 'string',
        'price' => 'float',
    ];
}

З ліфтом

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    public float $price;
}

Hidden Attribute

Lift надає атрибут, Hidden який можна використовувати для приховування властивостей моделі під час її перетворення на масив або JSON.

Без ліфта

use Illuminate\Database\Eloquent\Model;

final class Product extends Model
{
    protected $fillable = [
        'name',
        'price',
        'active',
    ];
    protected $casts = [
        'id' => 'int',
        'name' => 'string',
        'price' => 'float',
        'active' => 'boolean',
    ];
    protected $hidden = [
        'active',
    ];
}

З ліфтом

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Hidden;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    public float $price;

    #[Hidden]
    #[Fillable]
    #[Cast('boolean')]
    public bool $active;
}

Immutable Attribute

Lift надає атрибут, Immutable який можна використовувати, щоб зробити властивості незмінними. Це означає, що після створення моделі властивість не можна змінити. Якщо ви спробуєте його змінити, буде кинутоWendellAdriel\Lift\Exceptions\ImmutablePropertyException.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Immutable;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Immutable]
    #[Fillable]
    #[Cast('string')]
    public string $name;
}
$product = Product::query()->create([
    'name' => 'Product 1',
]);
$product->name = 'Product 2';
$product->save(); // Throws an WendellAdriel\Lift\Exceptions\ImmutablePropertyException

PrimaryKey Attribute

Lift надає атрибут, PrimaryKey який можна використовувати для налаштування первинного ключа моделі.

Без ліфта

use Illuminate\Database\Eloquent\Model;

final class Product extends Model
{
    public $incrementing = false;

    protected $primaryKey = 'uuid';

    protected $keyType = 'string';
    // ...
}

З ліфтом

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\PrimaryKey;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[PrimaryKey(type: 'string', incrementing: false)]
    #[Cast('string')]
    public string $uuid;
    // ...
}

Правила Attribute

Lift надає атрибут, Rules за допомогою якого можна визначити правила перевірки властивостей моделі.

Перевірки можна встановити так само, як і в запиті форми Laravel, і ви навіть можете встановити власні повідомлення для кожного правила.

⚠️ Правила будуть перевірені лише тоді, коли ви збережете свою модель (створите або оновите)

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Rules;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    #[Rules(['required', 'string', 'max:255'])]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    #[Rules(['required', 'numeric', 'min:0.0'])]
    public float $price;

    #[Fillable]
    #[Cast('boolean')]
    #[Rules(rules: ['required', 'boolean'], messages: ['required' => 'You must set the active status for the product'])]
    public bool $active;
}

Watch Attribute

За замовчуванням Eloquent вже запускає події, коли модель створюється, оновлюється, видаляється тощо. Але це загальна подія, і іноді потрібно запускати певну подію, коли змінюється властивість. Ось тут Watch на допомогу приходить атрибут.

Можна визначити спеціальну подію, яка запускатиметься під час змінення властивості. Подія отримає як параметр оновлений екземпляр моделі.

// Product.php
use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Watch;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    #[Watch(PriceChangedEvent::class)]
    public float $price;

    #[Fillable]
    #[Cast('boolean')]
    public bool $active;
}
// PriceChangedEvent.php
final class PriceChangedEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public function __construct(
        public Product $product,
    ) {
    }
}

Методи

Окрім усіх атрибутів, які надає пакет, він також надає деякі методи, які ви можете використовувати, щоб отримати більше інформації про ваші моделі.

customColumns()

Він поверне масив з усіма настроюваними стовпцями, визначеними у вашій моделі.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Column;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Cast('string')]
    #[Column('product_name')]
    public string $name;

    #[Cast('float')]
    #[Column(name: 'product_price', default: 0.0]
    public float $price;
}
Product::customColumns();

// WILL RETURN
[
    'name' => 'product_name',
    'price' => 'product_price',
]

defaultValues()

Він поверне масив з усіма властивостями, для яких визначено значення за замовчуванням. Якщо значення за замовчуванням є функцією, замість результату функції буде повернуто ім'я функції, оскільки це статичний виклик.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Column;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Cast('string')]
    #[Column('product_name')]
    public string $name;

    #[Cast('float')]
    #[Column(name: 'product_price', default: 0.0]
    public float $price;

    #[Cast('float')]
    #[Column(default: 'generatePromotionalPrice')]
    public float $promotional_price;

    public function generatePromotionalPrice(): float
    {
        return $this->price * 0.8;
    }
}
Product::defaultValues();

// WILL RETURN
[
    'price' => 0.0,
    'promotional_price' => 'generatePromotionalPrice',
]

immutableProperties()

Він поверне масив з усіма незмінними властивостями.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Immutable;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Immutable]
    #[Fillable]
    #[Cast('string')]
    public string $name;
}
Product::immutableProperties();

// WILL RETURN
[
    'name',
]

validationMessages()

Він поверне масив з усіма повідомленнями перевірки, визначеними у вашій моделі.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Rules;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    #[Rules(['required', 'string', 'max:255'])]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    #[Rules(['required', 'numeric', 'min:0.0'])]
    public float $price;

    #[Fillable]
    #[Cast('boolean')]
    #[Rules(rules: ['required', 'boolean'], messages: ['required' => 'You must set the active status for the product'])]
    public bool $active;
}
Product::validationMessages();

// WILL RETURN
[
    'name' => [],
    'price' => [],
    'active' => [
        'required' => 'You must set the active status for the product',
    ],
]

validationRules()

Він поверне масив з усіма правилами перевірки, визначеними у вашій моделі.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Rules;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    #[Rules(['required', 'string', 'max:255'])]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    #[Rules(['required', 'numeric', 'min:0.0'])]
    public float $price;

    #[Fillable]
    #[Cast('boolean')]
    #[Rules(rules: ['required', 'boolean'], messages: ['required' => 'You must set the active status for the product'])]
    public bool $active;
}
Product::validationRules();

// WILL RETURN
[
    'name' => ['required', 'string', 'max:255'],
    'price' => ['required', 'numeric', 'min:0.0'],
    'active' => ['required', 'boolean'],
]

watchedProperties()

Він поверне масив з усіма властивостями з визначеною користувацькою подією.

use Illuminate\Database\Eloquent\Model;
use WendellAdriel\Lift\Attributes\Cast;
use WendellAdriel\Lift\Attributes\Fillable;
use WendellAdriel\Lift\Attributes\Watch;
use WendellAdriel\Lift\Lift;

final class Product extends Model
{
    use Lift;

    #[Cast('int')]
    public int $id;

    #[Fillable]
    #[Cast('string')]
    public string $name;

    #[Fillable]
    #[Cast('float')]
    #[Watch(PriceChangedEvent::class)]
    public float $price;

    #[Fillable]
    #[Cast('boolean')]
    public bool $active;
}
Product::watchedProperties();

// WILL RETURN
[
    'price' => PriceChangedEvent::class,
]

Висновок

Lift - це пакет, який надає деякі функції таких інструментів, як Doctrine, Spring та Entity Framework , до Eloquent.

Це полегшує читання та розуміння ваших моделей, а також має більш чистий вигляд, використовуючи переваги атрибутів PHP 8.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297