orobogenius / laravel-model-statable
为 Laravel 模型添加状态。
Requires
- php: >=5.6.4
- illuminate/support: ~5
Requires (Dev)
- mockery/mockery: ^1.1
- orchestra/testbench: ~3.0
- phpunit/phpunit: ~7.0
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 install
或 composer 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) - 更多信息请参阅许可证文件。