Kontrak
. .
- Cara menggunakan kontrak
- Rujukan Kontrak
- PengenalanKontrak Laravel ialah satu set Rangka kerja menyediakan antara muka yang mentakrifkan perkhidmatan teras. Contohnya, kontrak mentakrifkan kaedah yang diperlukan untuk menghantar e-mel.
- Setiap kontrak mempunyai pelaksanaan yang disediakan oleh rangka kerja yang sepadan. Contohnya, Laravel menyediakan pelbagai pelaksanaan baris gilir pemacu dan menggunakan SwiftMailer untuk melaksanakan kontrak e-mel. Semua kontrak Laravel berada dalam repositori GitHub masing-masing
- . Ini menyediakan entri rujukan pantas untuk semua kontrak yang tersedia dan pakej tunggal yang dipisahkan yang boleh digunakan oleh pembangun pakej sambungan.
Contracts Vs. Facades
Fungsi Fasad dan pembantu Laravel menyediakan cara mudah untuk menggunakan perkhidmatan Laravel tanpa petunjuk jenis, dan juga boleh menyelesaikan kontrak di luar bekas perkhidmatan. Dalam kebanyakan kes, setiap Fasad mempunyai kontrak yang setara.
Tidak seperti Facades (yang tidak memerlukan pembina dalam kelas anda untuk merujuk kebergantungan), kontrak membolehkan anda menentukan kebergantungan eksplisit untuk kelas anda. Sesetengah pembangun lebih suka kebergantungan ditakrifkan dengan jelas dan oleh itu lebih suka menggunakan kontrak, manakala pemaju lain menikmati kemudahan yang dibawa oleh fasad.
{tip} Dalam kebanyakan aplikasi, sama ada anda lebih suka Fasad atau Kontrak, tidak mengapa. Walau bagaimanapun, jika anda sedang membina pakej sambungan, anda harus mempertimbangkan untuk menggunakan kontrak, kerana ia memudahkan ujian dalam konteks pakej.
Bila menggunakan kontrak
Ringkasnya, sama ada untuk menggunakan kontrak atau fasad sebahagian besarnya bergantung pada pilihan peribadi atau pasukan anda. Kedua-dua Kontrak dan Fasad boleh digunakan untuk membina aplikasi Laravel yang teguh dan diuji dengan baik. Selagi anda memastikan tanggungjawab kelas anda mudah, anda akan mendapati bahawa perbezaan sebenar antara menggunakan kontrak dan Facades adalah sangat kecil.
Namun, anda mungkin masih mempunyai banyak soalan tentang kontrak. Sebagai contoh, mengapa anda menggunakan antara muka? Bukankah lebih rumit untuk menggunakan antara muka? Mari kita keluarkan sebab dalam kandungan berikut ("gandingan rendah" dan "kesederhanaan").
Gandingan rendah
Pertama, mari kita lihat beberapa kod gandingan tinggi untuk pelaksanaan cache. Katakan kita mempunyai kod berikut:
<?php namespace App\Orders; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param \SomePackage\Cache\Memcached $cache * @return void */ public function __construct(\SomePackage\Cache\Memcached $cache) { $this->cache = $cache; } /** * 根据 ID 获取订单. * * @param int $id * @return Order */ public function find($id) { if ($this->cache->has($id)) { // } } }
Dalam kelas ini, kod sangat digabungkan dengan pelaksanaan cache yang diberikan. Ia sangat digabungkan kerana kami bergantung pada kelas cache tertentu dalam pakej sambungan. Jika API sambungan berubah, kod kami juga perlu berubah.
Begitu juga, jika kita ingin menggantikan teknologi caching asas (Memcached) dengan teknologi caching lain (Redis), kita perlu mengubah suai asas kod kita semula. Pangkalan kod kami tidak sepatutnya mengetahui terlalu banyak tentang siapa yang memberikan data atau cara data itu disediakan.
Kami boleh menambah baik kod kami dengan bergantung pada antara muka bebas pakej yang ringkas dan bukannya pelaksanaan sebelumnya:
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository{ /** * 缓存实例. */ protected $cache; /** * 创建一个新的仓库实例. * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
Kini kod itu tidak digabungkan dengan mana-mana pakej tertentu, malah Laravel tidak relevan. Memandangkan pakej sambungan kontrak tidak mengandungi sebarang pelaksanaan dan kebergantungan, anda boleh dengan mudah mengekod pelaksanaan alternatif untuk kontrak tertentu, membolehkan anda menggantikan pelaksanaan cache tanpa mengubah suai sebarang kod cache.
Mudah
Apabila semua perkhidmatan Laravel ditakrifkan dengan kemas dalam antara muka yang ringkas, mudah untuk menentukan fungsi yang disediakan oleh perkhidmatan tertentu. Kontrak bertindak sebagai dokumen ringkas tentang fungsi rangka kerja.
Selain itu, apabila anda bergantung pada antara muka yang ringkas, kod anda lebih mudah difahami dan diselenggara. Daripada menjejaki kaedah yang tersedia dalam kelas yang besar dan kompleks, anda boleh merujuk kepada antara muka yang mudah dan bersih.
Bagaimana menggunakan kontrak
Jadi, bagaimana anda melaksanakan kontrak? Ia sebenarnya agak mudah.
Banyak jenis kelas dalam Laravel diselesaikan melalui bekas perkhidmatan, termasuk pengawal, pendengar acara, perisian tengah, kerja baris gilir dan juga penutupan laluan, dsb. Kemudian, untuk mendapatkan pelaksanaan kontrak, anda hanya perlu menaip antara muka "type hint" dalam pembina kelas untuk diselesaikan.
Sebagai contoh, lihat pada pendengar acara ini:
<?php namespace App\Listeners; use App\User;use App\Events\OrderWasPlaced; use Illuminate\Contracts\Redis\Factory; class CacheOrderInformation{ /** * Redis 工厂实现。 */ protected $redis; /** * 创建一个新的事件处理器实例。 * * @param Factory $redis * @return void */ public function __construct(Factory $redis) { $this->redis = $redis; } /** * 处理事件。 * * @param OrderWasPlaced $event * @return void */ public function handle(OrderWasPlaced $event) { // } }
Apabila pendengar acara diselesaikan, bekas perkhidmatan akan membaca pembayang jenis pada pembina kelas dan menyuntik nilai yang sesuai. Untuk mengetahui lebih lanjut tentang mendaftar dengan bekas perkhidmatan, lihat dokumentasi bekas perkhidmatan.
Rujukan Kontrak
Jadual ini menyediakan rujukan pantas semua kontrak Laravel dan fasad yang setara dengannya:
Fasad Rujukan Pintu