Stellen Sie sich vor, Sie möchten, dass ein eloquentes Model einen Status erhält. Das lässt sich leicht lösen, indem man diesem Modell einfach ein status
hinzufügt und fertig. Wenn Sie jedoch einen Verlauf der Statusänderungen benötigen oder zusätzliche Informationen darüber speichern müssen, warum sich ein Status geändert hat, reicht das Hinzufügen eines einzelnen Felds nicht aus.
Dieses Paket stellt eine HasStatuses
-Eigenschaft bereit, die Ihnen nach der Installation auf einem Modell Folgendes ermöglicht:
// 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'
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Sie können das Paket über Composer installieren:
composer require spatie/laravel-model-status
Sie müssen die Migration veröffentlichen mit:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " migrations "
Migrieren Sie die statuses
:
php artisan migrate
Optional können Sie die Konfigurationsdatei veröffentlichen mit:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " config "
Dies ist der Inhalt der Datei, die unter config/model-status.php
veröffentlicht wird
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 ' ,
];
Fügen Sie die Eigenschaft HasStatuses
zu einem Modell hinzu, für das Sie Status verwenden möchten.
use Spatie ModelStatus HasStatuses ;
class YourEloquentModel extends Model
{
use HasStatuses;
}
Sie können einen neuen Status wie folgt festlegen:
$ model -> setStatus ( ' status-name ' );
Als zweites Argument kann ein Grund für die Statusänderung übergeben werden.
$ model -> setStatus ( ' status-name ' , ' optional reason ' );
Den aktuellen Status des Modells können Sie abrufen:
$ 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()`
Sie können auch den aktuellen Status eines bestimmten Namens abrufen:
$ model -> latestStatus ( ' pending ' ); // returns an instance of `SpatieModelStatusStatus` that has the name `pending`
Rufen Sie alle verfügbaren Statusnamen für das Modell ab.
$ statusNames = $ model -> getStatusNames (); // returns a collection of all available status names.
Die folgenden Beispiele geben Status vom Typ status 1
oder status 2
zurück, je nachdem, welcher Zeitpunkt aktueller ist.
$ lastStatus = $ model -> latestStatus ([ ' status 1 ' , ' status 2 ' ]);
// or alternatively...
$ lastStatus = $ model -> latestStatus ( ' status 1 ' , ' status 2 ' );
Alle zugehörigen Status eines Modells können wie folgt abgerufen werden:
$ allStatuses = $ model -> statuses ;
Dadurch wird überprüft, ob das Modell den folgenden Status hat:
$ model -> setStatus ( ' status1 ' );
$ isStatusExist = $ model -> hasStatus ( ' status1 ' ); // return true
$ isStatusExist = $ model -> hasStatus ( ' status2 ' ); // return false
Der currentStatus
-Bereich gibt Modelle zurück, die einen Status mit dem angegebenen Namen haben.
$ allPendingModels = Model:: currentStatus ( ' pending ' );
//or array of statuses
$ allPendingModels = Model:: currentStatus ([ ' pending ' , ' initiated ' ]);
$ allPendingModels = Model:: currentStatus ( ' pending ' , ' initiated ' );
Der Bereich otherCurrentStatus
gibt alle Modelle zurück, die keinen Status mit dem angegebenen Namen haben, einschließlich aller Modelle, denen kein Status zugeordnet ist.
$ allNonPendingModels = Model:: otherCurrentStatus ( ' pending ' );
Sie können auch ein Array von Statusnamen angeben, die von der Abfrage ausgeschlossen werden sollen.
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ([ ' initiated ' , ' pending ' ]);
// or alternatively...
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ( ' initiated ' , ' pending ' );
Sie können beim Festlegen eines Status eine benutzerdefinierte Validierung hinzufügen, indem Sie die Methode isValidStatus
überschreiben:
public function isValidStatus ( string $ name , ? string $ reason = null ): bool
{
. . .
if (! $ condition ) {
return false ;
}
return true ;
}
Wenn isValidStatus
false
zurückgibt, wird eine SpatieModelStatusExceptionsInvalidStatus
-Ausnahme ausgelöst.
Sie können die Validierung mit der Methode forceSetStatus
umgehen:
$ model -> forceSetStatus ( ' invalid-status-name ' );
Sie können jederzeit überprüfen, ob ein bestimmter Status für das Modell festgelegt wurde, indem Sie die Methode hasEverHadStatus
verwenden:
$ model -> hasEverHadStatus ( ' status 1 ' );
Sie können jederzeit überprüfen, ob für das Modell noch nie ein bestimmter Status festgelegt wurde, indem Sie die Methode hasNeverHadStatus
verwenden:
$ model -> hasNeverHadStatus ( ' status 1 ' );
Sie können jeden beliebigen Status, der für das Modell festgelegt wurde, jederzeit löschen, indem Sie die Methode deleteStatus
verwenden:
Einzelnen Status aus Modell löschen:
$ model -> deleteStatus ( ' status 1 ' );
Mehrere Status gleichzeitig aus dem Modell löschen:
$ model -> deleteStatus ([ ' status 1 ' , ' status 2 ' ]);
Das SpatieModelStatusEventsStatusUpdated
Ereignis wird ausgelöst, wenn der Status aktualisiert wird.
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 ;
}
}
Sie können das verwendete Modell ändern, indem Sie einen Klassennamen im Schlüssel status_model
der Konfigurationsdatei model-status
angeben.
Sie können den in der Statustabelle verwendeten Spaltennamen (standardmäßig model_id
) ändern, wenn Sie eine benutzerdefinierte Migration verwenden, bei der Sie ihn geändert haben. Ändern Sie in diesem Fall einfach den Schlüssel model_primary_key_attribute
der Konfigurationsdatei model-status
.
Dieses Paket enthält Integrationstests, die von Orchestral/Testbench unterstützt werden.
Sie können alle Tests ausführen mit:
composer test
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie einen Sicherheitsfehler gefunden haben, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.