• Czas czytania ~8 min
  • 08.09.2023

Lift to pakiet, który wzmacnia Twoje modele Eloquent w Laravel.

Umożliwia tworzenie właściwości publicznych w modelach wymowy, które pasują do schematu tabeli. Dzięki temu modele są łatwiejsze do odczytania i pracy z nimi w dowolnym środowisku IDE.

Zapewnia prosty sposób konfiguracji modeli, koncentrując się na prostocie i łatwości użycia przy użyciu atrybutów PHP 8.

Pakiet zależy od Eloquent Events. Oznacza to, że pakiet łatwo dopasowuje się do projektu bez konieczności wprowadzania większych zmian (chyba że wyłączono wyzwalanie zdarzeń).

W tym poście zanurzmy się głęboko w Lift i dowiedzmy się o wszystkich funkcjach, które zapewnia.

Instalacja Laravel Lift Możesz zainstalować pakiet za pomocą kompozytora:

Aby rozpocząć korzystanie z Lift

composer require wendelladriel/laravel-lift

, musisz dodać cechę Lift do swoich Eloquent Models i jesteś gotowy do pracy.

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

final class Product extends Model
{
    use Lift;
}

Funkcje

Po dodaniu Lift cechy do modeli elokwentnych można tworzyć na nich właściwości publiczne, dzięki czemu są łatwiejsze do zrozumienia i pracy w ramach dowolnego środowiska IDE.

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

final class Product extends Model
{
    use Lift;

    public $id;

    public $name;

    public $price;
}

Magia dzieje się, gdy zaczynasz używać atrybutów, które zapewnia pakiet.

Atrybuty

klasyPodniesienie atrybutu

DB udostępnia DB atrybut, którego można użyć do zdefiniowania połączenia, tabeli i sygnatur czasowych modelu.

Bez windy

use Illuminate\Database\Eloquent\Model;

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

    protected $connection = 'mysql';

    protected $table = 'custom_products_table';

    // ...
}

Z windą

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;
    // ...
}

Atrybuty relacjiLift udostępnia atrybuty do definiowania relacji między modelami, więc zamiast definiować je za pomocą metod, można je zdefiniować jako atrybuty

. Wszystkie atrybuty relacji akceptują te same parametry, które akceptują metody.

Bez windy

// 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);
    }
    // ...
}

Z windą

// 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;
    // ...
}

Możesz sprawdzić wszystkie dostępne atrybuty relacji w dokumentacji.

Relacje będą działać w taki sam sposób, jak gdyby zdefiniowano je za pomocą metod.

Atrybuty

właściwościSiła nośna atrybutów

rzutowania udostępnia atrybut, Cast którego można użyć do zdefiniowania rzutowania właściwości modelu. Oprócz rzutowania wartości, pozwala również na wpisanie właściwości.

Bez windy

use Illuminate\Database\Eloquent\Model;

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

Z windą

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;
}

Kolumna Podnoszenie atrybutów

udostępnia atrybut, Column którego można użyć do dostosowania nazwy kolumny właściwości modelu i zdefiniowania dla nich wartości domyślnych.

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;
}

W powyższym name przykładzie właściwość zostanie zamapowana na kolumnę, a price właściwość zostanie zamapowana na kolumnę product_name product_price z wartością 0.0domyślną .

Można nawet przekazać nazwę funkcji do wartości domyślnej, która zostanie wywołana po zapisaniu właściwości w bazie danych.

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;
    }
}

Atrybut

do wypełnienia Podczas korzystania Lift z cechy wszystkie atrybuty modelu są ustawione na strzeżone. Atrybutu Fillable można użyć do zdefiniowania, które właściwości mogą być przypisywane grupowo.

Bez windy

use Illuminate\Database\Eloquent\Model;

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

Z windą

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;
}

Ukryty wzrost atrybutów

udostępnia atrybut, Hidden którego można użyć do ukrycia właściwości modelu po przekonwertowaniu go na tablicę lub kod JSON.

Bez windy

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',
    ];
}

Z windą

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;
}

Niezmienna wartość podnoszenia atrybutów

udostępnia atrybut, Immutable którego można użyć do uczynienia właściwości niezmiennymi. Oznacza to, że po utworzeniu modelu nie można zmienić właściwości. Jeśli spróbujesz to zmienić, zostanie rzuconyWendellAdriel\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

Podnoszenie atrybutów

PrimaryKey udostępnia atrybut, PrimaryKey którego można użyć do dostosowania klucza podstawowego modelu.

Bez windy

use Illuminate\Database\Eloquent\Model;

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

    protected $primaryKey = 'uuid';

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

Z windą

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;
    // ...
}

Podnoszenie atrybutów

reguł udostępnia atrybut, Rules którego można użyć do zdefiniowania reguł sprawdzania poprawności właściwości modelu.

Sprawdzanie poprawności można ustawić w taki sam sposób, jak w przypadku żądania formularza Laravel, a nawet ustawić niestandardowe komunikaty dla każdej reguły.

⚠️ Reguły zostaną zweryfikowane tylko po zapisaniu modelu (utworzeniu lub aktualizacji)

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;
}

Atrybut Watch

Domyślnie Eloquent uruchamia już zdarzenia, gdy model jest tworzony, aktualizowany, usuwany itp. Jest to jednak zdarzenie ogólne i czasami trzeba uruchomić określone zdarzenie, gdy właściwość zostanie zmieniona. Watch Tu właśnie pojawia się atrybut.

Można zdefiniować zdarzenie niestandardowe, które zostanie uruchomione po zmianie właściwości. Zdarzenie otrzyma jako parametr zaktualizowaną instancję modelu.

// 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,
    ) {
    }
}

Metody

Oprócz wszystkich atrybutów pakietu udostępnia on również kilka metod, których można użyć, aby uzyskać więcej informacji o modelach.

customColumns()

Zwraca tablicę ze wszystkimi kolumnami niestandardowymi zdefiniowanymi w modelu.

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()

Zwraca tablicę ze wszystkimi właściwościami, które mają zdefiniowaną wartość domyślną. Jeśli wartością domyślną jest funkcja, zamiast wyniku funkcji zostanie zwrócona nazwa funkcji, ponieważ jest to wywołanie statyczne.

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()

Zwraca tablicę ze wszystkimi właściwościami, które są niezmienne.

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()

Zwraca tablicę ze wszystkimi komunikatami sprawdzania poprawności zdefiniowanymi w modelu.

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()

Zwraca tablicę ze wszystkimi regułami sprawdzania poprawności zdefiniowanymi w modelu.

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()

Zwraca tablicę ze wszystkimi właściwościami ze zdefiniowanym zdarzeniem niestandardowym.

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,
]

Wyciąg wniosków

to pakiet, który wprowadza niektóre funkcje narzędzi takich jak Doctrine, Spring i Entity Framework do Eloquent.

Sprawia, że modele są łatwiejsze do odczytania i zrozumienia oraz mają bardziej przejrzysty wygląd, wykorzystując atrybuty PHP 8.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297