orobogenius/laravel-model-statable

为 Laravel 模型添加状态。

1.0.0 2019-01-25 22:07 UTC

This package is auto-updated.

Last update: 2024-08-29 04:54:37 UTC


README

此软件包允许您为 Laravel 模型添加预定义的状态。这允许您在应用程序的各个位置定义可应用于模型的状态。您可以在一个地方定义所有状态,并将模型实例转换到不同的状态。例如,您可以定义一个 admin 状态,将用户转换为管理员。

内容

安装

Composer

要通过 composer 安装此软件包,只需运行

$ composer require orobogenius/laravel-model-statable

或者只需在 composer.json 文件中添加

"orobogenius/laravel-model-statable": "~1.0"

然后运行 composer installcomposer udpate

使用

要为 Laravel 模型添加状态,将 Orobogenius\Statable\Statable 特性添加到模型中。

<?php

use Orobogenius\Statable\Statable;

class User extends Model
{
    use Statable;
    //...
}

此特性允许您将预定义的状态应用于模型实例。为了让软件包了解可应用于模型的适用状态,您必须首先定义它们。状态定义为您模型上的方法。要定义状态,请使用 state 前缀模型方法。

定义的状态应始终返回一个以模型属性为键的数组。

<?php

use Illuminate\Database\Eloquent\Model;
use Orobogenius\Statable\Statable;

class User extends Model
{
    use Statable;
    
    public function stateAdmin()
    {
        return [
            'is_admin' => true
        ];
    }
}

应用状态

对于已定义在模型上的状态,您可以调用模型实例上的 states 方法,并传递要应用于模型的状态

$user = User::find(1);
$user->states('admin');

// $user->is_admin: true

当然,您可以通过向 states 方法传递状态数组来将多个状态应用于模型

use Illuminate\Database\Eloquent\Model;
use Orobogenius\Statable\Statable;

class User extends Model
{
    use Statable;
    
    public function stateAdmin()
    {
        return [
            'is_admin' => true
        ];
    }
    
    public function stateModerator()
    {
        return [
            'is_moderator' => true
        ];
    }
}
$user = User::find(1);
$user->states(['admin', 'moderator']);

// $user->is_admin: true
// $user->is_moderator: true

闭包属性

您可以在模型状态定义中添加闭包属性。闭包还接收定义它们的包围状态的评估属性

<?php

use Illuminate\Database\Eloquent\Model;
use Orobogenius\Statable\Statable;

class User extends Model
{
    use Statable;
    
    public function stateSuperAdmin()
    {
        return [
            'is_super_admin' => function ($attributes) {
                return $this->is_admin && $this->is_moderator;
            }
        ];
    }
}

关系

您可以在模型的状态定义中指定关系和应用于这些关系的状态。这允许您在应用某些状态于模型实例时更新相关模型。例如,当发票处于已支付状态时,将所有发票项设置为 已处理。要向模型的状态定义添加关系,将 with_relations 键添加到从状态定义返回的数组中。值应是一个指定关系作为键和应用于该关系的状态作为值的数组

发票

<?php

use Illuminate\Database\Eloquent\Model;
use Orobogenius\Statable\Statable;

class Invoice extends Model
{
    use Statable;
    
    public function items()
    {
        return $this->hasMany(InvoiceItem::class);
    }

    public function statePaid()
    {
        return [
            'status' => 'paid',
            'with_relations' => ['items' => 'processed']
        ];
    }
}

发票项

<?php

use Illuminate\Database\Eloquent\Model;
use Orobogenius\Statable\Statable;

class InvoiceItem extends Model
{
    use Statable;
    
    public function invoice()
    {
        return $this->belongsTo(Invoice::class);
    }

    public function stateProcessed()
    {
        return [
            'status' => 'processed'
        ];
    }
}
$invoice = Invoice::find(1);
$invoice->states('paid');

// $invoice->status: paid
// $invoice->items: (status) processed

模型定义中关系的值也可以是应用于相关模型的多个状态的数组。

    public function statePaid()
    {
        return [
            'status' => 'paid',
            'with_relations' => ['items' => ['processed', 'valid']]
        ];
    }

测试

$ composer test

许可证

MIT 许可证 (MIT) - 更多信息请参阅许可证文件