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 ;
}
}
model-status
구성 파일의 status_model
키에 클래스 이름을 지정하여 사용되는 모델을 변경할 수 있습니다.
변경한 사용자 정의 마이그레이션을 사용할 때 상태 테이블(기본적으로 model_id
)에 사용된 열 이름을 변경할 수 있습니다. 이 경우 model-status
구성 파일의 model_primary_key_attribute
키를 변경하면 됩니다.
이 패키지에는 오케스트라/테스트벤치로 구동되는 통합 테스트가 포함되어 있습니다.
다음을 사용하여 모든 테스트를 실행할 수 있습니다.
composer test
최근 변경된 사항에 대한 자세한 내용은 CHANGELOG를 참조하세요.
자세한 내용은 CONTRIBUTING을 참조하세요.
보안 관련 버그를 발견한 경우 이슈 트래커를 사용하는 대신 [email protected]로 메일을 보내주세요.
MIT 라이센스(MIT). 자세한 내용은 라이센스 파일을 참조하십시오.