Bayangkan Anda ingin model Eloquent memiliki status. Ini mudah diselesaikan hanya dengan menambahkan bidang status
ke model itu dan menyelesaikannya. Namun jika Anda memerlukan riwayat perubahan status atau perlu menyimpan beberapa informasi tambahan tentang alasan suatu status berubah, menambahkan satu bidang saja tidak akan cukup.
Paket ini menyediakan sifat HasStatuses
yang, setelah diinstal pada model, memungkinkan Anda melakukan hal-hal seperti ini:
// 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'
Kami menginvestasikan banyak sumber daya untuk menciptakan paket sumber terbuka terbaik di kelasnya. Anda dapat mendukung kami dengan membeli salah satu produk berbayar kami.
Kami sangat menghargai Anda mengirimi kami kartu pos dari kota asal Anda, yang menyebutkan paket kami mana yang Anda gunakan. Anda akan menemukan alamat kami di halaman kontak kami. Kami mempublikasikan semua kartu pos yang diterima di dinding kartu pos virtual kami.
Anda dapat menginstal paket melalui composer:
composer require spatie/laravel-model-status
Anda harus memublikasikan migrasi dengan:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " migrations "
Migrasikan tabel statuses
:
php artisan migrate
Secara opsional, Anda dapat mempublikasikan file konfigurasi dengan:
php artisan vendor:publish --provider= " SpatieModelStatusModelStatusServiceProvider " --tag= " config "
Ini adalah isi file yang akan dipublikasikan di 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 ' ,
];
Tambahkan sifat HasStatuses
ke model yang ingin Anda gunakan statusnya.
use Spatie ModelStatus HasStatuses ;
class YourEloquentModel extends Model
{
use HasStatuses;
}
Anda dapat mengatur status baru seperti ini:
$ model -> setStatus ( ' status-name ' );
Alasan perubahan status dapat dijadikan argumen kedua.
$ model -> setStatus ( ' status-name ' , ' optional reason ' );
Anda bisa mendapatkan status model saat ini:
$ 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()`
Anda juga bisa mendapatkan status terbaru dari nama yang diberikan:
$ model -> latestStatus ( ' pending ' ); // returns an instance of `SpatieModelStatusStatus` that has the name `pending`
Dapatkan semua nama status yang tersedia untuk model tersebut.
$ statusNames = $ model -> getStatusNames (); // returns a collection of all available status names.
Contoh berikut akan mengembalikan status bertipe status 1
atau status 2
, mana saja yang terbaru.
$ lastStatus = $ model -> latestStatus ([ ' status 1 ' , ' status 2 ' ]);
// or alternatively...
$ lastStatus = $ model -> latestStatus ( ' status 1 ' , ' status 2 ' );
Semua status terkait model dapat diambil seperti ini:
$ allStatuses = $ model -> statuses ;
Ini akan memeriksa apakah model memiliki status:
$ model -> setStatus ( ' status1 ' );
$ isStatusExist = $ model -> hasStatus ( ' status1 ' ); // return true
$ isStatusExist = $ model -> hasStatus ( ' status2 ' ); // return false
Cakupan currentStatus
akan mengembalikan model yang memiliki status dengan nama yang diberikan.
$ allPendingModels = Model:: currentStatus ( ' pending ' );
//or array of statuses
$ allPendingModels = Model:: currentStatus ([ ' pending ' , ' initiated ' ]);
$ allPendingModels = Model:: currentStatus ( ' pending ' , ' initiated ' );
Cakupan otherCurrentStatus
akan mengembalikan semua model yang tidak memiliki status dengan nama yang diberikan, termasuk model apa pun yang tidak memiliki status apa pun yang terkait dengannya.
$ allNonPendingModels = Model:: otherCurrentStatus ( ' pending ' );
Anda juga dapat memberikan serangkaian nama status untuk dikecualikan dari kueri.
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ([ ' initiated ' , ' pending ' ]);
// or alternatively...
$ allNonInitiatedOrPendingModels = Model:: otherCurrentStatus ( ' initiated ' , ' pending ' );
Anda dapat menambahkan validasi khusus saat mengatur status dengan menimpa metode isValidStatus
:
public function isValidStatus ( string $ name , ? string $ reason = null ): bool
{
. . .
if (! $ condition ) {
return false ;
}
return true ;
}
Jika isValidStatus
mengembalikan false
pengecualian SpatieModelStatusExceptionsInvalidStatus
akan dilempar.
Anda dapat melewati validasi dengan metode forceSetStatus
:
$ model -> forceSetStatus ( ' invalid-status-name ' );
Anda dapat memeriksa apakah status tertentu telah ditetapkan pada model kapan saja dengan menggunakan metode hasEverHadStatus
:
$ model -> hasEverHadStatus ( ' status 1 ' );
Anda dapat memeriksa apakah status tertentu belum pernah ditetapkan pada model kapan pun dengan menggunakan metode hasNeverHadStatus
:
$ model -> hasNeverHadStatus ( ' status 1 ' );
Anda dapat menghapus status tertentu yang telah ditetapkan pada model kapan saja dengan menggunakan metode deleteStatus
:
Hapus status tunggal dari model:
$ model -> deleteStatus ( ' status 1 ' );
Hapus beberapa status dari model sekaligus:
$ model -> deleteStatus ([ ' status 1 ' , ' status 2 ' ]);
Acara SpatieModelStatusEventsStatusUpdated
akan dikirim ketika status diperbarui.
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 ;
}
}
Anda dapat mengubah model yang digunakan dengan menentukan nama kelas di kunci status_model
pada file konfigurasi model-status
.
Anda dapat mengubah nama kolom yang digunakan dalam tabel status ( model_id
secara default) saat menggunakan migrasi khusus tempat Anda mengubahnya. Dalam hal ini, cukup ubah kunci model_primary_key_attribute
dari file konfigurasi model-status
.
Paket ini berisi pengujian integrasi yang didukung oleh orkestra/testbench.
Anda dapat menjalankan semua tes dengan:
composer test
Silakan lihat CHANGELOG untuk informasi lebih lanjut tentang apa yang berubah baru-baru ini.
Silakan lihat KONTRIBUSI untuk rinciannya.
Jika Anda menemukan bug terkait keamanan, silakan kirim email ke [email protected] alih-alih menggunakan pelacak masalah.
Lisensi MIT (MIT). Silakan lihat File Lisensi untuk informasi lebih lanjut.