想象一下,您想让一个 Eloquent 模型保持一定的地位。只需向该模型添加一个status
字段并使用它即可轻松解决此问题。但是,如果您需要状态更改的历史记录或需要存储一些有关状态更改原因的额外信息,仅添加单个字段是不够的。
该包提供了HasStatuses
特征,一旦安装在模型上,您就可以执行以下操作:
// set a status
$ model -> setStatus ( ' pending ' , ' needs verification ' );
// set another status
$ model -> setStatus ( ' accepted ' );
// specify a reason
$ model -> setStatus ( ' rejected ' , ' My rejection reason ' );
// get the current status
$ model -> status (); // returns an instance of SpatieModelStatusStatus
// get the previous status
$ latestPendingStatus = $ model -> latestStatus ( ' pending ' );
$ latestPendingStatus -> reason ; // returns 'needs verification'
我们投入了大量资源来创建一流的开源包。您可以通过购买我们的一款付费产品来支持我们。
我们非常感谢您从家乡寄给我们一张明信片,并注明您正在使用我们的哪种套餐。您可以在我们的联系页面上找到我们的地址。我们在虚拟明信片墙上发布所有收到的明信片。
您可以通过 Composer 安装该软件包:
composer require spatie/laravel-model-status
您必须通过以下方式发布迁移:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " migrations "
迁移statuses
表:
php artisan migrate
您可以选择使用以下方式发布配置文件:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " config "
这是将在config/model-status.php
发布的文件的内容
return [
/*
* The class name of the status model that holds all statuses.
*
* The model must be or extend `SpatieModelStatus Status ` .
*/
' status_model ' => Spatie ModelStatus Status::class,
/*
* The name of the column which holds the ID of the model related to the statuses .
*
* You can change this value if you have set a different name in the migration for the statuses table .
*/
' model_primary_key_attribute ' => ' model_id ' ,
];
将HasStatuses
特征添加到您想要使用状态的模型中。
use Spatie ModelStatus HasStatuses ;
class YourEloquentModel extends Model
{
use HasStatuses;
}
您可以像这样设置新状态:
$ model -> setStatus ( ' status-name ' );
状态更改的原因可以作为第二个参数传递。
$ model -> setStatus ( ' status-name ' , ' optional reason ' );
您可以获取模型的当前状态:
$ model -> status ; // returns a string with the name of the latest status
$ model -> status (); // returns the latest instance of `SpatieModelStatusStatus`
$ model -> latestStatus (); // equivalent to `$model->status()`
您还可以获取给定名称的最新状态:
$ model -> latestStatus ( ' pending ' ); // returns an instance of `SpatieModelStatusStatus` that has the name `pending`
获取模型的所有可用状态名称。
$ statusNames = $ model -> getStatusNames (); // returns a collection of all available status names.
以下示例将返回类型为status 1
或status 2
的状态(以最新者为准)。
$ lastStatus = $ model -> latestStatus ([ ' status 1 ' , ' status 2 ' ]);
// or alternatively...
$ lastStatus = $ model -> latestStatus ( ' status 1 ' , ' status 2 ' );
可以像这样检索模型的所有关联状态:
$ allStatuses = $ model -> statuses ;
这将检查模型是否具有状态:
$ model -> setStatus ( ' status1 ' );
$ isStatusExist = $ model -> hasStatus ( ' status1 ' ); // return true
$ isStatusExist = $ model -> hasStatus ( ' status2 ' ); // return false
currentStatus
范围将返回具有给定名称状态的模型。
$ allPendingModels = Model:: currentStatus ( ' pending ' );
//or array of statuses
$ allPendingModels = Model:: currentStatus ([ ' pending ' , ' initiated ' ]);
$ allPendingModels = Model:: currentStatus ( ' pending ' , ' initiated ' );
otherCurrentStatus
范围将返回不具有给定名称状态的所有模型,包括不具有与其关联的任何状态的任何模型。
$ allNonPendingModels = Model:: otherCurrentStatus ( ' pending ' );
您还可以提供要从查询中排除的状态名称数组。
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ([ ' initiated ' , ' pending ' ]);
// or alternatively...
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ( ' initiated ' , ' pending ' );
您可以在设置状态时通过覆盖isValidStatus
方法添加自定义验证:
public function isValidStatus ( string $ name , ? string $ reason = null ): bool
{
. . .
if (! $ condition ) {
return false ;
}
return true ;
}
如果isValidStatus
返回false
则会抛出SpatieModelStatusExceptionsInvalidStatus
异常。
您可以使用forceSetStatus
方法绕过验证:
$ model -> forceSetStatus ( ' invalid-status-name ' );
您可以随时使用hasEverHadStatus
方法检查模型上是否已设置特定状态:
$ model -> hasEverHadStatus ( ' status 1 ' );
您可以使用hasNeverHadStatus
方法随时检查模型上是否从未设置过特定状态:
$ model -> hasNeverHadStatus ( ' status 1 ' );
您可以随时使用deleteStatus
方法删除模型上设置的任何给定状态:
从模型中删除单个状态:
$ model -> deleteStatus ( ' status 1 ' );
一次从模型中删除多个状态:
$ model -> deleteStatus ([ ' status 1 ' , ' status 2 ' ]);
当状态更新时,将调度SpatieModelStatusEventsStatusUpdated
事件。
namespace Spatie ModelStatus Events ;
use Illuminate Database Eloquent Model ;
use Spatie ModelStatus Status ;
class StatusUpdated
{
/** @var SpatieModelStatus Status | null */
public $ oldStatus ;
/ ** @var SpatieModelStatus Status */
public $ newStatus ;
/ ** @var IlluminateDatabaseEloquent Model */
public $ model ;
public function __construct (? Status $ oldStatus , Status $ newStatus , Model $ model )
{
$ this -> oldStatus = $ oldStatus ;
$ this -> newStatus = $ newStatus ;
$ this -> model = $ model ;
}
}
您可以通过在model-status
配置文件的status_model
键中指定类名来更改所使用的模型。
当使用自定义迁移时,您可以更改状态表中使用的列名称(默认为model_id
)。在这种情况下,只需更改model-status
配置文件的model_primary_key_attribute
键即可。
该软件包包含由 Orchestral/testbench 提供支持的集成测试。
您可以使用以下命令运行所有测试:
composer test
请参阅变更日志以了解最近更改的更多信息。
详细信息请参阅贡献。
如果您发现有关安全的错误,请发送邮件至 [email protected],而不是使用问题跟踪器。
麻省理工学院许可证 (MIT)。请参阅许可证文件以获取更多信息。