Управління відносинами володіння між моделями Eloquent за допомогою Laravel Ownable

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 03 вересня, 2025
Вам цікаво, як ефективно управляти власністю моделей у вашому додатку Laravel? Ознайомтеся з пакетом Laravel Ownable, який дозволяє легко передавати права на володіння, відстежувати історію власності та здійснювати операції з кількома об'єктами одночасно

Пакет Laravel Ownable, розроблений Абдуллою Совейлем, надає зручний і гнучкий спосіб управління правом власності на будь-яку модель з іншої моделі у вашій Laravel аплікації.

# Основні можливості

# Приклад використання

Припустимо, у нас є моделі User та Task. Завдяки пакету Laravel Ownable ми можемо представити право власності, використовуючи контракти Owner та Ownable, а також трейт HasOwnables і IsOwnable у відповідних моделях.

use Sowailem\Ownable\Traits\HasOwnables;
use Sowailem\Ownable\Contracts\Owner as OwnerContract;
 
// Модель власника (наприклад, User)
class User extends Authenticatable implements OwnerContract
{
    use HasOwnables;
}
use Sowailem\Ownable\Traits\IsOwnable;
use Sowailem\Ownable\Contracts\Ownable as OwnableContract;
 
// Модель з правом власності
class Task extends Model implements OwnableContract
{
    use IsOwnable;
}

Тепер у вас є доступ до кількох методів, які дозволяють надати, забрати, видалити та перевірити право власності.

$user = User::first();
$task = Task::first();
 
// Надати право власності на задачу користувачу
$user->giveOwnershipTo($task);
 
$task->ownedBy($user);
 
if ($task->isOwnedBy($user)) {
    // Перевірка, чи належить задача користувачу
}
 
// Передача прав власності іншому користувачу
$someOtherUser = User::find(2);
$user->transferOwnership($task, $someOtherUser);
 
// Отримати поточного власника об'єкта
$currentOwner = $task->currentOwner();
 
// Отримати всіх власників (включно з історією власності)
$allOwnersOfTheTask = $task->owners()->get();
 
// Прибрати право власності
$user->takeOwnershipFrom($task);

Якщо ви віддаєте перевагу використовувати реалізацію фасаду, вона також доступна.

use Illuminate\Support\Facades\Log;
use Sowailem\Ownable\Facades\Owner;
 
$user = User::find(4);
$task = Task::find(2);
 
Owner::give($user, $task);
 
if (Owner::check($user, $task)) {
    Log::info("Користувач {$user->id} є власником задачі {$task->id}");
}
 
$newOwner = User::find(1);
 
Owner::transfer($user, $newOwner, $task);
Log::info("Задача {$task->id} тепер належить {$task->currentOwner()->name}");

Ще однією корисною функцією пакету є наявність міграції, яка допомагає відстежувати зміни у праві власності на ваші моделі. Записи у вашій базі даних виглядають приблизно так:

Дізнайтеся більше про цей пакет та перегляньте вихідний код на GitHub