Eloquent モデルにステータスを保持させたいと想像してください。この問題は、そのモデルにstatus
フィールドを追加するだけで簡単に解決でき、それで終わりです。ただし、ステータスの変更履歴が必要な場合や、ステータスが変更された理由に関する追加情報を保存する必要がある場合は、フィールドを 1 つ追加するだけでは不十分です。
このパッケージは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 ' );
ステータス変更の理由は 2 番目の引数として渡すことができます。
$ 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
キーを変更するだけです。
このパッケージには、オーケストラ/テストベンチを利用した統合テストが含まれています。
すべてのテストは次のように実行できます。
composer test
最近の変更点の詳細については、CHANGELOG を参照してください。
詳細については、「貢献」を参照してください。
セキュリティに関するバグを見つけた場合は、問題トラッカーを使用する代わりに [email protected] にメールを送信してください。
MIT ライセンス (MIT)。詳細については、ライセンス ファイルを参照してください。