Представьте, что вы хотите, чтобы модель 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 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 ;
}
}
Вы можете изменить используемую модель, указав имя класса в ключе status_model
конфигурационного файла model-status
.
Вы можете изменить имя столбца, используемое в таблице состояний (по умолчанию model_id
), при использовании пользовательской миграции, где вы это изменили. В этом случае просто измените ключ model_primary_key_attribute
файла конфигурации model-status
.
Этот пакет содержит интеграционные тесты, созданные на базе оркестрового/тестового стенда.
Вы можете запустить все тесты с помощью:
composer test
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.