Imaginez que vous souhaitiez qu'un modèle Eloquent détienne un statut. Il est facilement résolu en ajoutant simplement un champ status
à ce modèle et en finissant avec. Mais si vous avez besoin d'un historique des changements de statut ou si vous avez besoin de stocker des informations supplémentaires sur les raisons pour lesquelles un statut a changé, le simple ajout d'un seul champ ne suffira pas.
Ce package fournit un trait HasStatuses
qui, une fois installé sur un modèle, vous permet de faire des choses comme ceci :
// 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'
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
composer require spatie/laravel-model-status
Vous devez publier la migration avec :
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " migrations "
Migrez la table statuses
:
php artisan migrate
Vous pouvez éventuellement publier le fichier de configuration avec :
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " config "
C'est le contenu du fichier qui sera publié sur 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 ' ,
];
Ajoutez le trait HasStatuses
à un modèle sur lequel vous souhaitez utiliser des statuts.
use Spatie ModelStatus HasStatuses ;
class YourEloquentModel extends Model
{
use HasStatuses;
}
Vous pouvez définir un nouveau statut comme celui-ci :
$ model -> setStatus ( ' status-name ' );
Une raison pour le changement de statut peut être transmise comme deuxième argument.
$ model -> setStatus ( ' status-name ' , ' optional reason ' );
Vous pouvez obtenir l'état actuel du modèle :
$ 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()`
Vous pouvez également obtenir le dernier statut d'un nom donné :
$ model -> latestStatus ( ' pending ' ); // returns an instance of `SpatieModelStatusStatus` that has the name `pending`
Obtenez tous les noms de statut disponibles pour le modèle.
$ statusNames = $ model -> getStatusNames (); // returns a collection of all available status names.
Les exemples suivants renverront des statuts de type status 1
ou status 2
, selon la dernière éventualité.
$ lastStatus = $ model -> latestStatus ([ ' status 1 ' , ' status 2 ' ]);
// or alternatively...
$ lastStatus = $ model -> latestStatus ( ' status 1 ' , ' status 2 ' );
Tous les statuts associés d'un modèle peuvent être récupérés comme ceci :
$ allStatuses = $ model -> statuses ;
Cela vérifiera si le modèle a le statut :
$ model -> setStatus ( ' status1 ' );
$ isStatusExist = $ model -> hasStatus ( ' status1 ' ); // return true
$ isStatusExist = $ model -> hasStatus ( ' status2 ' ); // return false
La portée currentStatus
renverra les modèles qui ont un statut avec le nom donné.
$ allPendingModels = Model:: currentStatus ( ' pending ' );
//or array of statuses
$ allPendingModels = Model:: currentStatus ([ ' pending ' , ' initiated ' ]);
$ allPendingModels = Model:: currentStatus ( ' pending ' , ' initiated ' );
La portée otherCurrentStatus
renverra tous les modèles qui n'ont pas de statut avec le nom donné, y compris tout modèle auquel aucun statut n'est associé.
$ allNonPendingModels = Model:: otherCurrentStatus ( ' pending ' );
Vous pouvez également fournir un tableau de noms d'état à exclure de la requête.
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ([ ' initiated ' , ' pending ' ]);
// or alternatively...
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ( ' initiated ' , ' pending ' );
Vous pouvez ajouter une validation personnalisée lors de la définition d'un statut en écrasant la méthode isValidStatus
:
public function isValidStatus ( string $ name , ? string $ reason = null ): bool
{
. . .
if (! $ condition ) {
return false ;
}
return true ;
}
Si isValidStatus
renvoie false
une exception SpatieModelStatusExceptionsInvalidStatus
sera levée.
Vous pouvez contourner la validation avec la méthode forceSetStatus
:
$ model -> forceSetStatus ( ' invalid-status-name ' );
Vous pouvez vérifier si un statut spécifique a été défini sur le modèle à tout moment en utilisant la méthode hasEverHadStatus
:
$ model -> hasEverHadStatus ( ' status 1 ' );
Vous pouvez vérifier si un statut spécifique n'a jamais été défini sur le modèle à tout moment en utilisant la méthode hasNeverHadStatus
:
$ model -> hasNeverHadStatus ( ' status 1 ' );
Vous pouvez supprimer n'importe quel statut donné qui a été défini sur le modèle à tout moment en utilisant la méthode deleteStatus
:
Supprimer un statut unique du modèle :
$ model -> deleteStatus ( ' status 1 ' );
Supprimez plusieurs statuts du modèle à la fois :
$ model -> deleteStatus ([ ' status 1 ' , ' status 2 ' ]);
L'événement SpatieModelStatusEventsStatusUpdated
sera distribué lorsque le statut est mis à jour.
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 ;
}
}
Vous pouvez modifier le modèle utilisé en spécifiant un nom de classe dans la clé status_model
du fichier de configuration model-status
.
Vous pouvez modifier le nom de la colonne utilisé dans la table d'état ( model_id
par défaut) lors de l'utilisation d'une migration personnalisée dans laquelle vous l'avez modifié. Dans ce cas, modifiez simplement la clé model_primary_key_attribute
du fichier de configuration model-status
.
Ce package contient des tests d'intégration optimisés par Orchestral/Testbench.
Vous pouvez exécuter tous les tests avec :
composer test
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.