Imagine que desea que un modelo de Eloquent tenga un estado. Se resuelve fácilmente simplemente agregando un campo status
a ese modelo y listo. Pero en caso de que necesite un historial de cambios de estado o necesite almacenar información adicional sobre por qué cambió un estado, simplemente agregar un solo campo no será suficiente.
Este paquete proporciona un rasgo HasStatuses
que, una vez instalado en un modelo, le permite hacer cosas como esta:
// 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'
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Agradecemos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Puede instalar el paquete a través del compositor:
composer require spatie/laravel-model-status
Debes publicar la migración con:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " migrations "
Migrar la tabla de statuses
:
php artisan migrate
Opcionalmente, puede publicar el archivo de configuración con:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " config "
Este es el contenido del archivo que se publicará en 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 ' ,
];
Agregue el rasgo HasStatuses
a un modelo en el que le guste usar estados.
use Spatie ModelStatus HasStatuses ;
class YourEloquentModel extends Model
{
use HasStatuses;
}
Puede establecer un nuevo estado como este:
$ model -> setStatus ( ' status-name ' );
Se puede pasar un motivo del cambio de estado como segundo argumento.
$ model -> setStatus ( ' status-name ' , ' optional reason ' );
Puede obtener el estado actual del modelo:
$ 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()`
También puede obtener el estado más reciente de un nombre determinado:
$ model -> latestStatus ( ' pending ' ); // returns an instance of `SpatieModelStatusStatus` that has the name `pending`
Obtenga todos los nombres de estado disponibles para el modelo.
$ statusNames = $ model -> getStatusNames (); // returns a collection of all available status names.
Los siguientes ejemplos devolverán estados de tipo status 1
o status 2
, el que sea más reciente.
$ lastStatus = $ model -> latestStatus ([ ' status 1 ' , ' status 2 ' ]);
// or alternatively...
$ lastStatus = $ model -> latestStatus ( ' status 1 ' , ' status 2 ' );
Todos los estados asociados de un modelo se pueden recuperar así:
$ allStatuses = $ model -> statuses ;
Esto comprobará si el modelo tiene estado:
$ model -> setStatus ( ' status1 ' );
$ isStatusExist = $ model -> hasStatus ( ' status1 ' ); // return true
$ isStatusExist = $ model -> hasStatus ( ' status2 ' ); // return false
El alcance currentStatus
devolverá modelos que tengan un estado con el nombre de pila.
$ allPendingModels = Model:: currentStatus ( ' pending ' );
//or array of statuses
$ allPendingModels = Model:: currentStatus ([ ' pending ' , ' initiated ' ]);
$ allPendingModels = Model:: currentStatus ( ' pending ' , ' initiated ' );
El alcance otherCurrentStatus
devolverá todos los modelos que no tienen un estado con el nombre de pila, incluido cualquier modelo que no tenga ningún estado asociado a ellos.
$ allNonPendingModels = Model:: otherCurrentStatus ( ' pending ' );
También puede proporcionar una serie de nombres de estado para excluir de la consulta.
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ([ ' initiated ' , ' pending ' ]);
// or alternatively...
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ( ' initiated ' , ' pending ' );
Puede agregar validación personalizada al establecer un estado sobrescribiendo el método isValidStatus
:
public function isValidStatus ( string $ name , ? string $ reason = null ): bool
{
. . .
if (! $ condition ) {
return false ;
}
return true ;
}
Si isValidStatus
devuelve false
se generará una excepción SpatieModelStatusExceptionsInvalidStatus
.
Puede omitir la validación con el método forceSetStatus
:
$ model -> forceSetStatus ( ' invalid-status-name ' );
Puede comprobar si se ha establecido un estado específico en el modelo en cualquier momento utilizando el método hasEverHadStatus
:
$ model -> hasEverHadStatus ( ' status 1 ' );
Puede comprobar si nunca se ha establecido un estado específico en el modelo en cualquier momento utilizando el método hasNeverHadStatus
:
$ model -> hasNeverHadStatus ( ' status 1 ' );
Puede eliminar cualquier estado determinado que se haya establecido en el modelo en cualquier momento utilizando el método deleteStatus
:
Eliminar estado único del modelo:
$ model -> deleteStatus ( ' status 1 ' );
Elimine varios estados del modelo a la vez:
$ model -> deleteStatus ([ ' status 1 ' , ' status 2 ' ]);
El evento SpatieModelStatusEventsStatusUpdated
se enviará cuando se actualice el estado.
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 ;
}
}
Puede cambiar el modelo utilizado especificando un nombre de clase en la clave status_model
del archivo de configuración model-status
.
Puede cambiar el nombre de la columna utilizada en la tabla de estado ( model_id
de forma predeterminada) cuando utiliza una migración personalizada en la que cambió eso. En ese caso, simplemente cambie la clave model_primary_key_attribute
del archivo de configuración model-status
.
Este paquete contiene pruebas de integración impulsadas por Orchestral/testbench.
Puede ejecutar todas las pruebas con:
composer test
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Si encuentra un error relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.