PSR-14 - acara utama dalam PHP

Tahun lalu, PHP-FIG , Kelompok Konsep Kompatibilitas PHP , merilis beberapa spesifikasi baru. Yang terakhir, PSR-14 , didedikasikan untuk pengiriman acara. Seperti PSR lain, ini adalah spesifikasi lokal, tetapi memiliki dampak besar pada banyak aspek standardisasi.

Dari seorang penerjemah: Ini adalah terjemahan dari bagian pertama dari serangkaian publikasi di mana Larry (Crell) Garfield, salah satu anggota PHP-FIG, menjelaskan apa itu PSR-14, apa yang mampu dan apa yang tidak, dan apa cara terbaik untuk menggunakannya dalam proyek mereka.

Tujuan


Pengiriman acara telah lama digunakan dalam banyak bahasa. Jika Anda pernah menggunakan EventDispatcher di Symfony , sistem acara di Laravel , kait di Drupal, Manajer Acara dalam kerangka Zend, paket League \ Event , atau sesuatu seperti itu, maka Anda tahu apa ini.

Secara umum, semua sistem ini adalah bentuk "mediator-observer". Sepotong kode mengirimkan pesan jenis - "peristiwa", dan perantara mengirimkannya ke bagian kode lainnya - "pendengar". Kadang-kadang sinyal diarahkan hanya dalam satu arah, kadang-kadang "pendengar" entah bagaimana dapat mengirimkan data kembali ke pemanggil. Tentu saja, mereka semua berbeda dan tidak terlalu kompatibel satu sama lain.

Ini adalah masalah untuk perpustakaan mandiri yang ingin terhubung ke berbagai perpustakaan dan aplikasi. Banyak perpustakaan dapat diperluas dengan mengirimkan acara dalam satu bentuk atau yang lain sehingga kode lain dapat menghubungi mereka. Tetapi lapisan perantara seperti itu, pada kenyataannya, adalah hak milik. Perpustakaan yang menjalankan Symfony EventDispatcher kemudian digabungkan dengan Symfony. Kemudian menggunakannya di tempat lain memerlukan menginstal EventDispatcher dan menghubungkan ke perpustakaan dalam program ini. Perpustakaan yang memanggil sistem penjilidan dari Drupal module_invoke_all() kemudian ditautkan ke Drupal. Dan sebagainya.

Tujuan dari PSR-14 adalah untuk menghilangkan perpustakaan dari ketergantungan ini. Ini memungkinkan perpustakaan untuk memperluas melalui lapisan umum yang tipis, dan kemudian memfasilitasi transfer mereka ke lingkungan lain tanpa usaha dan biaya tambahan, misalnya, di Symfony, Zend Framework, Laravel, TYPO3, eZ Platform atau Slim. Selama lingkungan memiliki kompatibilitas dengan PSR-14, semuanya akan berfungsi.

Spesifikasi


Seperti yang sudah disebutkan, spesifikasinya cukup ringan. Ini adalah tiga antarmuka dalam satu metode dan deskripsi meta tentang cara menggunakannya. Semuanya sederhana dan nyaman. Di bawah ini adalah kode untuk antarmuka ini (tidak ada komentar untuk menghemat ruang).

 namespace Psr\EventDispatcher; interface EventDispatcherInterface { public function dispatch(object $event); } interface ListenerProviderInterface { public function getListenersForEvent(object $event) : iterable; } interface StoppableEventInterface { public function isPropagationStopped() : bool; } 

Dua yang pertama adalah inti dari spesifikasi. StoppableEventInterface adalah ekstensi yang akan kami kembalikan nanti.

Saya pikir EventDispatcher biasa bagi sebagian besar dari Anda - itu hanya objek dengan metode yang Anda lewati acara - perantara yang sudah Anda bicarakan. Acara itu sendiri, bagaimanapun, tidak didefinisikan - itu bisa berupa objek PHP . Lebih lanjut tentang ini nanti.

Sebagian besar implementasi yang ada memiliki satu objek atau serangkaian fungsi yang bertindak sebagai perantara atau pengirim dan tempat untuk mendaftarkan kode yang menerima acara (pendengar). Untuk PSR-14, kami sengaja membagi dua tanggung jawab ini menjadi objek yang terpisah. Dispatcher menerima daftar pendengar dari objek penyedia yang membentuk daftar ini.

Dari mana penyedia mendapatkan daftar pendengar? Tapi kemana dia mau! Ada satu miliar dan satu cara untuk menghubungkan pendengar dan acara tersebut, semuanya benar-benar valid dan tidak kompatibel. Pada awalnya, kami memutuskan bahwa standarisasi "One True Way" untuk mendaftarkan siswa akan terlalu terbatas. Namun, dengan menstandarkan proses menghubungkan pendengar ke operator, Anda bisa mendapatkan fleksibilitas luar biasa tanpa memaksa pengguna untuk melakukan sesuatu yang aneh dan tidak bisa dipahami.

Juga, kode tersebut tidak menunjukkan apa yang dimaksud pendengar. Ini bisa berupa fragmen PHP yang mampu persepsi sinyal: fungsi, fungsi anonim, metode objek, apa pun. Karena objek yang dipanggil dapat melakukan apa saja, maka diizinkan untuk memiliki, sebagai pendengar, fungsi anonim yang melakukan pemuatan yang tertunda dari sebuah layanan dari sebuah wadah DI dan memanggil metode dalam layanan tersebut, yang sebenarnya berisi kode mendengarkan.

Singkatnya, operator adalah API sederhana dan mudah untuk penulis perpustakaan. Penyedia pendengar menawarkan API yang kuat dan fleksibel untuk integrator kerangka kerja, dan hubungan antara operator dan penyedia menyatukan mereka.

Contoh sederhana


Secara umum, skema menggabungkan semua bagian menjadi satu kesatuan akan terlihat seperti ini.

 class Dispatcher implements EventDispatcherInterface { public function __construct(ListenerProviderInterface $provider) { $this->provider = $provider; } public function dispatch(object $event) { foreach ($this->provider->getListenersForEvent($event) as $listener) { $listener($event); } return $event; } } $dispatcher = new Dispatcher($provider); $event = new SomethingHappened(); $dispatcher->dispatch($event); 

Sepotong kode kecil ini menawarkan peluang besar, dan sangat fleksibel. Dalam artikel-artikel berikut, kita akan berbicara secara rinci tentang sifat-sifatnya, menganalisis beberapa solusi struktural, dan mempertimbangkan banyak cara untuk menggunakan peristiwa ringan seperti itu.

Kode


PSR-14 sudah didukung oleh kerangka kerja dan aplikasi utama.

  • Matthew Weier O'Phinney telah berjanji untuk memperkenalkan dukungan untuk PSR-14 di zend-eventmanager 4.0 dalam kerangka Zend.
  • Symfony baru-baru ini mengumumkan perubahan pada EventDispatcher untuk kompatibilitas dengan PSR-14, yang akan memberikan dukungan penuh di 5.0 / 5.1.
  • Kerangka kerja Yii mengumumkan niatnya untuk mengintegrasikan PSR-14 dalam versi 3.0 .
  • Benni Mack dari TYPO3 CMS mengatakan bahwa dalam rilis TYPO3 berikutnya, semua konsep perangkap + sinyal / slot yang ada akan mendukung PSR-14.

PSR-14 juga memiliki tiga implementasi independen yang berfungsi penuh yang sudah dapat Anda gunakan dalam aplikasi apa pun.


Penulis berterima kasih kepada seluruh kelompok kerja PSR: Larry Garfield , Cees-Jan Kiewiet , Benjamin Mack , Elizabeth Smith , Ryan Weaver , Matthew Weier O'Phinney . Sepanjang pekerjaan, prosesnya sangat produktif: semua orang bekerja bersama, secara kolektif, sebagaimana mestinya. Hasilnya menyenangkan, dan saya ingin semua upaya lebih lanjut dalam pekerjaan bersama pada arsitektur menjadi sama produktifnya.

Anda dapat menemukan rincian lebih lanjut baik dari yang asli dari bagian berikutnya dan dokumentasi atau 17 Mei di PHP Russia . Opsi kedua menarik karena beberapa alasan. Misalnya, ketua Komite Program, Alexander ( samdark ) Makarov, adalah di antara mereka yang memperkenalkan PSR-14 di Yii. Dan pada prinsipnya, komposisi Komite Program dan pembicara sangat kuat, hampir tidak ada topik dari bidang penggunaan PHP profesional yang tidak dapat dibahas pada konferensi ini.

Source: https://habr.com/ru/post/id450812/


All Articles