Pustaka php sederhana yang berisi pernyataan dan metode penjagaan untuk validasi masukan (bukan pemfilteran!) dalam model bisnis, pustaka, dan kode aplikasi tingkat rendah. Pustaka dapat digunakan untuk mengimplementasikan kondisi pra/pasca pada data masukan.
Idenya adalah untuk mengurangi jumlah kode untuk mengimplementasikan pernyataan dalam model Anda dan juga menyederhanakan jalur kode untuk mengimplementasikan pernyataan. Ketika pernyataan gagal, pengecualian akan muncul, menghilangkan keharusan klausa if dalam kode Anda.
Perpustakaan tidak menggunakan Symfony atau Zend Validator karena suatu alasan: Pemeriksaan harus berupa kode tingkat rendah, cepat, dan tidak berorientasi objek agar dapat digunakan di mana pun diperlukan. Menggunakan salah satu dari dua perpustakaan memerlukan instantiasi beberapa objek, menggunakan komponen lokal, terjemahan, sebut saja. Terlalu banyak kembung.
Menggunakan Komposer:
composer require beberlei/assert
<?php
use Assert Assertion ;
function duplicateFile ( $ file , $ times )
{
Assertion :: file ( $ file );
Assertion :: digit ( $ times );
for ( $ i = 0 ; $ i < $ times ; $ i ++) {
copy ( $ file , $ file . $ i );
}
}
Penggunaan waktu nyata dengan Azure Blob Storage:
<?php
public function putBlob ( $ containerName = '' , $ blobName = '' , $ localFileName = '' , $ metadata = array (), $ leaseId = null , $ additionalHeaders = array ())
{
Assertion :: notEmpty ( $ containerName , ' Container name is not specified ' );
self :: assertValidContainerName ( $ containerName );
Assertion :: notEmpty ( $ blobName , ' Blob name is not specified. ' );
Assertion :: notEmpty ( $ localFileName , ' Local file name is not specified. ' );
Assertion :: file ( $ localFileName , ' Local file name is not specified. ' );
self :: assertValidRootContainerBlobName ( $ containerName , $ blobName );
// Check file size
if ( filesize ( $ localFileName ) >= self :: MAX_BLOB_SIZE ) {
return $ this -> putLargeBlob ( $ containerName , $ blobName , $ localFileName , $ metadata , $ leaseId , $ additionalHeaders );
}
// Put the data to Windows Azure Storage
return $ this -> putBlobData ( $ containerName , $ blobName , file_get_contents ( $ localFileName ), $ metadata , $ leaseId , $ additionalHeaders );
}
Metode pembantu ( Assertion::nullOr*
) disediakan untuk memeriksa apakah suatu nilai adalah null ATAU berlaku untuk pernyataan:
<?php
Assertion :: nullOrMax ( null , 42 ); // success
Assertion :: nullOrMax ( 1 , 42 ); // success
Assertion :: nullOrMax ( 1337 , 42 ); // exception
Metode Assertion::all*
memeriksa apakah semua nilai yang diberikan berlaku untuk pernyataan tersebut. Ini akan memunculkan pengecualian pernyataan tidak berlaku untuk salah satu nilai:
<?php
Assertion :: allIsInstanceOf ( array ( new stdClass, new stdClass), ' stdClass ' ); // success
Assertion :: allIsInstanceOf ( array ( new stdClass, new stdClass), ' PDO ' ); // exception
Menggunakan API statis pada nilai sangat bertele-tele ketika memeriksa nilai terhadap beberapa pernyataan. Dimulai dengan versi 2.6.7 dari Assert, kelas Assert
menyediakan API fasih yang jauh lebih baik untuk pernyataan, dimulai dengan Assert::that($value)
dan kemudian menerima pernyataan yang ingin Anda panggil pada antarmuka fasih. Anda hanya perlu menentukan $value
satu kali.
<?php
Assert :: that ( $ value )-> notEmpty ()-> integer ();
Assert :: that ( $ value )-> nullOr ()-> string ()-> startsWith ( " Foo " );
Assert :: that ( $ values )-> all ()-> float ();
Ada juga dua fungsi pintasan Assert::thatNullOr()
dan Assert::thatAll()
yang masing-masing mengaktifkan helper "nullOr" atau "all".
Ada banyak kasus dalam pengembangan web, terutama ketika melibatkan formulir, Anda ingin mengumpulkan beberapa kesalahan daripada langsung membatalkan kesalahan pertama. Inilah gunanya pernyataan malas. API mereka bekerja persis seperti API Assert::that()
yang lancar, namun alih-alih melemparkan Pengecualian secara langsung, mereka mengumpulkan semua kesalahan dan hanya memicu pengecualian ketika metode verifyNow()
dipanggil pada objek AssertSoftAssertion
.
<?php
Assert :: lazy ()
-> that ( 10 , ' foo ' )-> string ()
-> that ( null , ' bar ' )-> notEmpty ()
-> that ( ' string ' , ' baz ' )-> isArray ()
-> verifyNow ();
Metode that($value, $propertyPath)
memerlukan jalur properti (nama), sehingga Anda mengetahui cara membedakan kesalahan setelahnya.
Jika gagal verifyNow()
akan memunculkan pengecualian Assert\LazyAssertionException
dengan pesan gabungan:
The following 3 assertions failed:
1) foo: Value "10" expected to be string, type integer given.
2) bar: Value "<NULL>" is empty, but non empty value was expected.
3) baz: Value "string" is not an array.
Anda juga dapat mengambil semua AssertionFailedException
dengan memanggil getErrorExceptions()
. Hal ini dapat berguna misalnya untuk membangun respons kegagalan bagi pengguna.
Bagi mereka yang ingin menangkap beberapa kesalahan pada satu nilai saat menggunakan rantai pernyataan malas, Anda dapat mengikuti panggilan Anda ke that
dengan tryAll
untuk menjalankan semua pernyataan terhadap nilai tersebut, dan menangkap semua pesan kesalahan pernyataan gagal yang dihasilkan. Berikut ini contohnya:
Assert :: lazy ()
-> that ( 10 , ' foo ' )-> tryAll ()-> integer ()-> between ( 5 , 15 )
-> that ( null , ' foo ' )-> tryAll ()-> notEmpty ()-> string ()
-> verifyNow ();
Gambar di atas menunjukkan cara menggunakan fungsi ini untuk menyempurnakan perilaku pelaporan kegagalan, namun untuk mempermudah menangkap semua kegagalan, Anda juga dapat memanggil tryAll
sebelum membuat pernyataan seperti di bawah ini. Ini membantu mengurangi pemanggilan metode, dan memiliki perilaku yang sama seperti di atas.
Assert :: lazy ()-> tryAll ()
-> that ( 10 , ' foo ' )-> integer ()-> between ( 5 , 15 )
-> that ( null , ' foo ' )-> notEmpty ()-> string ()
-> verifyNow ();
Fungsi berikut ada sebagai alias untuk Assert
konstruktor statis:
Assertthat()
AssertthatAll()
AssertthatNullOr()
Assertlazy()
Menggunakan konstruktor fungsional atau statis sepenuhnya merupakan preferensi pribadi.
Catatan: Konstruktor fungsional tidak akan bekerja dengan ekstensi Assertion
. Namun sangatlah mudah untuk membuat ulang fungsi-fungsi ini sedemikian rupa sehingga mengarah ke kelas yang diperluas.
<?php
use Assert Assertion ;
Assertion :: alnum (mixed $ value );
Assertion :: base64 (string $ value );
Assertion :: between (mixed $ value , mixed $ lowerLimit , mixed $ upperLimit );
Assertion :: betweenExclusive (mixed $ value , mixed $ lowerLimit , mixed $ upperLimit );
Assertion :: betweenLength (mixed $ value , int $ minLength , int $ maxLength );
Assertion :: boolean (mixed $ value );
Assertion :: choice (mixed $ value , array $ choices );
Assertion :: choicesNotEmpty (array $ values , array $ choices );
Assertion :: classExists (mixed $ value );
Assertion :: contains (mixed $ string , string $ needle );
Assertion ::count(array| Countable | ResourceBundle | SimpleXMLElement $ countable , int $ count );
Assertion :: date (string $ value , string $ format );
Assertion :: defined (mixed $ constant );
Assertion :: digit (mixed $ value );
Assertion :: directory (string $ value );
Assertion :: e164 (string $ value );
Assertion :: email (mixed $ value );
Assertion :: endsWith (mixed $ string , string $ needle );
Assertion :: eq (mixed $ value , mixed $ value2 );
Assertion :: eqArraySubset (mixed $ value , mixed $ value2 );
Assertion :: extensionLoaded (mixed $ value );
Assertion :: extensionVersion (string $ extension , string $ operator , mixed $ version );
Assertion :: false (mixed $ value );
Assertion :: file (string $ value );
Assertion :: float (mixed $ value );
Assertion :: greaterOrEqualThan (mixed $ value , mixed $ limit );
Assertion :: greaterThan (mixed $ value , mixed $ limit );
Assertion :: implementsInterface (mixed $ class , string $ interfaceName );
Assertion :: inArray (mixed $ value , array $ choices );
Assertion :: integer (mixed $ value );
Assertion :: integerish (mixed $ value );
Assertion :: interfaceExists (mixed $ value );
Assertion :: ip (string $ value , int $ flag = null );
Assertion :: ipv4 (string $ value , int $ flag = null );
Assertion :: ipv6 (string $ value , int $ flag = null );
Assertion :: isArray (mixed $ value );
Assertion :: isArrayAccessible (mixed $ value );
Assertion :: isCallable (mixed $ value );
Assertion ::isCountable(array| Countable | ResourceBundle | SimpleXMLElement $ value );
Assertion :: isInstanceOf (mixed $ value , string $ className );
Assertion :: isJsonString (mixed $ value );
Assertion :: isObject (mixed $ value );
Assertion :: isResource (mixed $ value );
Assertion :: isTraversable (mixed $ value );
Assertion :: keyExists (mixed $ value , string|int $ key );
Assertion :: keyIsset (mixed $ value , string|int $ key );
Assertion :: keyNotExists (mixed $ value , string|int $ key );
Assertion :: length (mixed $ value , int $ length );
Assertion :: lessOrEqualThan (mixed $ value , mixed $ limit );
Assertion :: lessThan (mixed $ value , mixed $ limit );
Assertion :: max (mixed $ value , mixed $ maxValue );
Assertion ::maxCount(array| Countable | ResourceBundle | SimpleXMLElement $ countable , int $ count );
Assertion :: maxLength (mixed $ value , int $ maxLength );
Assertion :: methodExists (string $ value , mixed $ object );
Assertion :: min (mixed $ value , mixed $ minValue );
Assertion ::minCount(array| Countable | ResourceBundle | SimpleXMLElement $ countable , int $ count );
Assertion :: minLength (mixed $ value , int $ minLength );
Assertion :: noContent (mixed $ value );
Assertion :: notBlank (mixed $ value );
Assertion :: notContains (mixed $ string , string $ needle );
Assertion :: notEmpty (mixed $ value );
Assertion :: notEmptyKey (mixed $ value , string|int $ key );
Assertion :: notEq (mixed $ value1 , mixed $ value2 );
Assertion :: notInArray (mixed $ value , array $ choices );
Assertion :: notIsInstanceOf (mixed $ value , string $ className );
Assertion :: notNull (mixed $ value );
Assertion :: notRegex (mixed $ value , string $ pattern );
Assertion :: notSame (mixed $ value1 , mixed $ value2 );
Assertion :: null (mixed $ value );
Assertion :: numeric (mixed $ value );
Assertion :: objectOrClass (mixed $ value );
Assertion :: phpVersion (string $ operator , mixed $ version );
Assertion :: propertiesExist (mixed $ value , array $ properties );
Assertion :: propertyExists (mixed $ value , string $ property );
Assertion :: range (mixed $ value , mixed $ minValue , mixed $ maxValue );
Assertion :: readable (string $ value );
Assertion :: regex (mixed $ value , string $ pattern );
Assertion :: same (mixed $ value , mixed $ value2 );
Assertion :: satisfy (mixed $ value , callable $ callback );
Assertion :: scalar (mixed $ value );
Assertion :: startsWith (mixed $ string , string $ needle );
Assertion :: string (mixed $ value );
Assertion :: subclassOf (mixed $ value , string $ className );
Assertion :: true (mixed $ value );
Assertion :: uniqueValues (array $ values );
Assertion :: url (mixed $ value );
Assertion :: uuid (string $ value );
Assertion :: version (string $ version1 , string $ operator , string $ version2 );
Assertion :: writeable (string $ value );
Ingat: Ketika parameter konfigurasi diperlukan, parameter tersebut selalu diteruskan SETELAH nilainya. Nilai selalu menjadi parameter pertama.
Jika salah satu pernyataan gagal, AssertAssertionFailedException
akan dilempar. Anda dapat meneruskan argumen bernama $message
ke pernyataan apa pun untuk mengontrol pesan pengecualian. Setiap pengecualian berisi pesan default dan kode pesan unik secara default.
<?php
use Assert Assertion ;
use Assert AssertionFailedException ;
try {
Assertion :: integer ( $ value , " The pressure of gas is measured in integers. " );
} catch ( AssertionFailedException $ e ) {
// error handling
$ e -> getValue (); // the value that caused the failure
$ e -> getConstraints (); // the additional constraints of the assertion.
}
AssertAssertionFailedException
hanyalah sebuah antarmuka dan implementasi defaultnya adalah AssertInvalidArgumentException
yang memperluas SPL InvalidArgumentException
. Anda dapat mengubah pengecualian yang digunakan pada tingkat berbasis paket.
Anda dapat meneruskan panggilan balik sebagai parameter pesan, sehingga memungkinkan Anda membuat pesan sendiri hanya jika pernyataan gagal, bukan setiap kali Anda menjalankan pengujian.
Callback akan diberikan dengan serangkaian parameter untuk pernyataan tersebut.
Karena beberapa pernyataan memanggil pernyataan lain, callback Anda perlu memberikan contoh array untuk menentukan pernyataan mana yang gagal.
Array akan berisi kunci bernama ::assertion
yang menunjukkan pernyataan mana yang gagal.
Panggilan balik harus mengembalikan string yang akan digunakan sebagai pesan pengecualian.
Untuk melindungi perpustakaan Anda dari kemungkinan bug, salah tafsir, atau kerusakan BC di dalam Assert, Anda harus memperkenalkan subkelas pernyataan berbasis perpustakaan/proyek, tempat Anda juga dapat mengganti pengecualian yang diberikan.
Selain itu, Anda dapat mengganti metode AssertAssertion::stringify()
untuk memberikan interpretasi Anda sendiri terhadap tipe selama penanganan kesalahan.
<?php
namespace MyProject ;
use Assert Assertion as BaseAssertion ;
class Assertion extends BaseAssertion
{
protected static $ exceptionClass = ' MyProjectAssertionFailedException ' ;
}
Mulai V2.9.2, Pernyataan Malas kini memiliki akses ke pernyataan tambahan apa pun yang ada di kelas pernyataan Anda sendiri.
Silakan lihat KONTRIBUSI untuk lebih jelasnya.