Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Laravel 5
Code

Bagaimana Cara Kerja Laravel Brodcasting

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Meyria (you can also view the original English article)

Hari ini, kita akan meneroka konsep penyiaran dalam rangka kerja web Laravel. Ia membolehkan anda menghantar pemberitahuan kepada pihak klien apabila sesuatu berlaku di sisi pelayan. Dalam artikel ini, kami akan menggunakan pustakawan pihak ketiga untuk menghantar pemberitahuan kepada pihak klien.

Jika anda pernah mahu menghantar pemberitahuan dari pelayan kepada klien apabila sesuatu berlaku pada pelayan di Laravel, anda sedang mencari ciri penyiaran.

Sebagai contoh, mari kita asumsikan bahawa anda telah melaksanakan aplikasi pesanan yang membolehkan pengguna sistem anda menghantar mesej kepada satu sama lain. Sekarang, apabila pengguna A menghantar mesej kepada pengguna B, anda ingin memaklumkan pengguna B dalam masa nyata. Anda boleh memaparkan popup atau kotak amaran yang memberitahu pengguna B tentang mesej baru!

Ini adalah kes penggunaan yang sempurna untuk berjalan melalui konsep penyiaran di Laravel, dan inilah yang akan kami laksanakan dalam artikel ini.

Sekiranya anda tertanya-tanya bagaimana pelayan boleh menghantar pemberitahuan kepada pelanggan, ia menggunakan soket di bawah hud untuk melakukannya. Mari kita fahami aliran asas soket sebelum kita menyelam lebih mendalam ke dalam pelaksanaan sebenar.

  • Pertama, anda memerlukan pelayan yang menyokong protokol web-sockets dan membolehkan pelanggan untuk membuat sambungan soket web.
  • Anda boleh melaksanakan pelayan anda sendiri atau menggunakan perkhidmatan pihak ketiga seperti Penolak. Kami akan lebih suka yang kedua dalam artikel ini.
  • Pelanggan memulakan sambungan soket web ke pelayan soket web dan menerima pengecam unik apabila sambungan berjaya.
  • Apabila sambungan berjaya, pelanggan melanggan saluran tertentu di mana ia ingin menerima acara.
  • Akhirnya, di bawah saluran yang dilanggan, pelanggan mendaftarkan peristiwa yang ingin didengar.
  • Sekarang di sisi pelayan, apabila peristiwa tertentu berlaku, kami memberitahu pelayan soket web dengan menyediakannya dengan nama saluran dan nama acara.
  • Dan akhirnya, pelayan soket web menyiarkan acara itu kepada klien berdaftar pada saluran tertentu itu.

Jangan bimbang jika ia kelihatan terlalu banyak dalam satu perjalanan sahaja; anda akan mendapat sambutan hangat semasa kita bergerak melalui artikel ini.

Seterusnya, mari kita lihat fail konfigurasi siaran lalai di config/broadcasting.php.

Secara lalai, Laravel menyokong pelbagai penyiar siaran dalam inti itu sendiri.

Dalam artikel ini, kita akan menggunakan penyesuai siaran Pusher. Untuk tujuan debugging, anda juga boleh menggunakan penyesuai log. Sudah tentu, jika anda menggunakan penyesuai log, pelanggan tidak akan menerima sebarang pemberitahuan acara, dan ia hanya akan dilog ke fail laravel.log.

Dari bahagian seterusnya dan seterusnya, kami akan menyelam ke dalam pelaksanaan sebenar kes penggunaan yang disebutkan di atas.

Menyediakan Prasyarat

Dalam penyiaran, terdapat pelbagai jenis saluran-awam, swasta, dan kehadiran. Apabila anda ingin menyiarkan acara anda secara terbuka, itu saluran umum yang anda patut gunakan. Sebaliknya, saluran peribadi digunakan apabila anda ingin menyekat pemberitahuan acara ke saluran peribadi tertentu.

Dalam kes penggunaan kami, kami ingin memaklumkan pengguna apabila mereka mendapat mesej baru. Dan untuk layak menerima pemberitahuan penyiaran, pengguna mesti dilog masuk. Oleh itu, kami perlu menggunakan saluran peribadi dalam kes kami.

Ciri Pengesahan Teras

Pertama, anda perlu mendayakan sistem pengesahan Laravel lalai supaya ciri-ciri seperti pendaftaran, log masuk dan kerja seperti keluar dari kotak. Jika anda tidak pasti bagaimana untuk melakukannya, dokumentasi rasmi memberikan pandangan yang cepat ke dalamnya.

Pemasangan dan Konfigurasi SDK

Oleh kerana kami menggunakan perkhidmatan pihak ketiga Pusher sebagai pelayan soket web kami, anda perlu create an account dengannya dan pastikan anda mempunyai bukti kelayakan API yang diperlukan dengan pendaftaran pos anda. Jika anda menghadapi sebarang masalah menciptanya, jangan ragu untuk bertanya kepada saya di bahagian komen.

Seterusnya, kita perlu memasang Pusher PHP SDK supaya aplikasi Laravel kami boleh menghantar pemberitahuan penyiaran ke pelayan soket web Pusher.

Di dalam akar aplikasi Laravel anda, jalankan arahan berikut untuk memasangnya sebagai pakej komposer.

Sekarang, mari kita ubah fail konfigurasi siaran untuk membolehkan penyesuai Pusher sebagai penyiar lalai lalai kita.

Seperti yang dapat anda lihat, kami telah menukar pemandu siaran lalai kepada Penolak. Kami juga telah menambah kumpulan konfigurasi dan pilihan konfigurasi yang disulitkan yang anda harus dapatkan dari akaun Penolak di tempat pertama.

Juga, ia mengambil nilai dari pembolehubah persekitaran. Oleh itu mari pastikan kita menetapkan pembolehubah berikut dalam fail .env dengan betul.

Seterusnya, saya perlu membuat beberapa perubahan dalam beberapa fail teras Laravel untuk menjadikannya serasi dengan SDK Penolak terkini. Sudah tentu, saya tidak mengesyorkan membuat sebarang perubahan pada kerangka teras, tetapi saya akan menyerlahkan apa yang perlu dilakukan.

Teruskan dan buka vendor/laravel/framework/src/Illuminate/Broadcastir file. Hanya gantikan cuplikan use Pusher; dengan use Pusher\Pusher;.

Seterusnya, mari buka failvendor/laravel/framework/src/Illuminate/Broadcastirdan buat perubahan serupa dalam coretan berikut.

Akhir sekali, mari kita mengaktifkan perkhidmatan penyiaran di config/app.php dengan membuang komen di baris berikut.

Setakat ini, kami telah memasang pustaka khusus pelayan. Di bahagian seterusnya, kami akan pergi ke perpustakaan pelanggan yang perlu dipasang juga.

Penolak dan Laravel Echo Perpustakaan-Pemasangan dan Konfigurasi

Dalam penyiaran, tanggungjawab pihak klien adalah untuk melanggan saluran dan mendengar peristiwa yang dikehendaki. Di bawah tudung, ia berfungsi dengan membuka sambungan baru ke pelayan soket web.

Nasib baik, kita tidak perlu melaksanakan apa-apa kandungan JavaScript yang kompleks untuk mencapainya kerana Laravel sudah menyediakan perpustakaan klien yang berguna, Laravel Echo, yang membantu kita menangani soket di sisi pelanggan. Juga, ia menyokong perkhidmatan Penolak yang akan kami gunakan dalam artikel ini.

Anda boleh memasang Laravel Echo menggunakan pengurus pakej NPM. Sudah tentu, anda perlu memasang nod dan npm di tempat pertama jika anda tidak memilikinya. Selebihnya adalah mudah, seperti yang ditunjukkan dalam coretan berikut.

Apa yang kami sukai ialah node_modules/laravel-echo/dist/echo.js fail yang anda perlu salin ke public/echo.js.

Ya, saya faham, ia agak berlebihan hanya untuk mendapatkan satu fail JavaScript. Jika anda tidak mahu melalui latihan ini, anda boleh memuat turun fail echo.js dari GitHub saya.

Dan dengan itu, kami selesai dengan persediaan perpustakaan pelanggan kami.

Persediaan Fail Back-End

Ingat bahawa kami bercakap tentang menyediakan aplikasi yang membolehkan pengguna aplikasi kami menghantar mesej kepada satu sama lain. Sebaliknya, kami akan menghantar pemberitahuan siaran kepada pengguna yang log masuk apabila mereka menerima mesej baru dari pengguna lain.

Dalam bahagian ini, kami akan membuat fail yang diperlukan untuk melaksanakan kes penggunaan yang kami cari.

Untuk bermula dengan, mari buat model Message yang memegang mesej yang dihantar oleh pengguna kepada satu sama lain.

Kami juga perlu menambah beberapa bidang seperti to, from dan message ke jadual pesanan kami. Jadi, mari kita ubah fail penghijrahan sebelum menjalankan perintah pemindahan.

Sekarang, mari kita jalankan arahan pemindahan yang mencipta jadual mesej dalam pangkalan data.

Setiap kali anda ingin meningkatkan acara adat di Laravel, anda harus membuat kelas untuk acara itu. Berdasarkan jenis peristiwa, Laravel bertindak balas dengan sewajarnya dan mengambil tindakan yang diperlukan.

Sekiranya peristiwa itu adalah peristiwa biasa, Laravel memanggil kelas pendengar yang berkaitan. Sebaliknya, jika acara itu adalah jenis siaran, Laravel menghantar acara itu ke pelayan soket web yang dikonfigurasi dalam fail config/broadcasting.php.

Semasa kami menggunakan perkhidmatan Penolak dalam contoh kami, Laravel akan menghantar acara ke pelayan Pusher.

Mari kita gunakan arahan artis berikut untuk membuat kelas peristiwa-NewMessageNotification.

Itu harus membuat kelas app/Events/NewMessageNotification.php. Mari menggantikan kandungan fail itu dengan yang berikut.

Perkara penting yang perlu diberi perhatian ialah kelas NewMessageNotification yang melaksanakan antara muka ShouldBroadcastNow. Oleh itu, apabila kita menaikkan peristiwa, Laravel mengetahui bahawa acara ini harus disiarkan.

Malah, anda juga boleh melaksanakan antara muka ShouldBroadcast, dan Laravel menambah acara ke dalam giliran acara. Ia akan diproses oleh pekerja barisan acara apabila mendapat peluang untuk melakukannya. Dalam kes kami, kami ingin menyiarkannya dengan segera, dan itulah sebabnya kami menggunakan antara muka ShouldBroadcastNow.

Dalam kes kami, kami ingin memaparkan mesej yang diterima oleh pengguna, dan oleh itu kami telah meluluskan model Message dalam hujah pembina. Dengan cara ini, data akan diluluskan bersama dengan acara tersebut.

Seterusnya, terdapat kaedah broadcastOn yang mentakrifkan nama saluran yang akan disiarkan. Dalam kes kami, kami telah menggunakan saluran peribadi kerana kami mahu menyekat penyiaran acara kepada pengguna log masuk.

$This->message->to variable merujuk kepada ID pengguna yang akan disiarkan. Oleh itu, ia secara berkesan menjadikan nama saluran seperti user.{USER_ID}.

Dalam kes saluran peribadi, pelanggan mesti mengesahkan dirinya sebelum membuat sambungan dengan pelayan soket web. Ia memastikan bahawa acara yang disiarkan di saluran peribadi dihantar kepada pelanggan yang disahkan sahaja. Dalam kes kami, ini bermakna hanya pengguna log masuk boleh melanggan saluran kami user.{USER_ID}.

Sekiranya anda menggunakan perpustakaan pelanggan Laravel Echo untuk langganan saluran, anda beruntung! Ia secara automatik menjaga bahagian pengesahan, dan anda hanya perlu menentukan laluan saluran.

Mari maju dan tambah laluan untuk saluran peribadi kami dalam fail routes/channels.php .

Seperti yang dapat anda lihat, kami telah menentukan user.{toUserId} laluan untuk saluran peribadi kami.

Hujah kedua kaedah saluran harus menjadi fungsi penutupan. Laravel secara automatik melepasi pengguna log masuk semasa sebagai hujah pertama fungsi penutupan, dan hujah kedua biasanya diambil dari nama saluran.

Apabila pelanggan cuba melanggan pengguna saluran peribadi. {USER_ID}, perpustakaan Laravel Echo melakukan pengesahan yang diperlukan di latar belakang menggunakan objek XMLHttpRequest, atau lebih dikenali sebagai XHR.

Setakat ini, kami telah selesai dengan persediaan, jadi mari maju dan mengujinya.

Persediaan Fail Hadapan

Dalam bahagian ini, kami akan membuat fail yang diperlukan untuk menguji kes penggunaan kami.

Mari maju dan buat fail pengawal di app/Http/Controllers/MessageController.php dengan kandungan berikut.

Dalam kaedah indeks, kami menggunakan paparan siaran, jadi mari kita mewujudkan pandangan resources/views/broadcast.blade.php juga.

Dan, tentu saja, kita perlu menambah laluan juga dalam fail routes/web.php.

Dalam kaedah pembina kelas pengawal, anda dapat melihat bahawa kami telah menggunakan middleware auth untuk memastikan bahawa kaedah pengawal hanya diakses oleh pengguna log masuk.

Seterusnya, terdapat kaedah indeks yang menyiarkan paparan penyiaran. Mari kita tarik kod yang paling penting dalam fail paparan.

Pertama, kami memuat perpustakaan pelanggan yang diperlukan, Laravel Echo dan Penolak, yang membolehkan kami membuka sambungan soket web ke pelayan soket web Pusher.

Seterusnya, kami membuat contoh Echo dengan menyediakan Penolak sebagai penyesuai penyiar kami dan maklumat lain yang berkaitan dengan Penolak.

Bergerak lebih jauh, kami menggunakan kaedah peribadi Echo untuk melanggan saluran peribadi user.{USER_ID}. Seperti yang telah dibincangkan sebelumnya, pelanggan mesti mengesahkan dirinya sebelum melanggan saluran swasta. Oleh itu, objek Echo melakukan pengesahan yang diperlukan dengan menghantar XHR di latar belakang dengan parameter yang diperlukan. Akhirnya, Laravel cuba mencari user.{USER_ID} laluan, dan ia sepadan dengan laluan yang kami tentukan dalam fail routes/channels.php.

Jika semuanya berjalan lancar, anda harus mempunyai sambungan soket web terbuka dengan pelayan soket web Pusher, dan ia menyenaraikan acara pada user.{USER_ID} saluran! Mulai sekarang, kami akan dapat menerima semua acara yang masuk pada saluran ini.

Dalam kes kami, kami ingin mendengar peristiwa NewMessageNotification dan dengan itu kami telah menggunakan kaedah listen objek Echo untuk mencapainya. Untuk menjaga perkara yang mudah, kami hanya akan memaklumkan mesej yang kami terima dari pelayan Penolak.

Jadi itu persediaan untuk menerima peristiwa dari pelayan web-soket. Seterusnya, kami akan melalui kaedah send dalam fail pengawal yang menimbulkan acara penyiaran.

Mari cepat tarik kod kaedah hantar.

Dalam kes kami, kami akan memberitahu pengguna log masuk apabila mereka menerima mesej baru. Oleh itu, kami telah cuba meniru kelakuan itu dalam kaedah send.

Seterusnya, kami telah menggunakan fungsi pembantu event untuk meningkatkan acara NewMessageNotification. Sejak acara NewMessageNotification adalah jenis ShouldBroadcastNow, Laravel memuat konfigurasi siaran lalai dari fail config/broadcasting.php. Akhirnya, ia menyiarkan acara NewMessageNotification ke pelayan soket web yang dikonfigurasi pada user.{USER_ID} saluran.

Dalam kes kami, acara itu akan disiarkan ke pelayan soket web Pusher pada user.{USER_ID} saluran. Jika ID pengguna penerima adalah 1, acara itu akan disiarkan melalui saluran user.1.

Seperti yang telah dibincangkan sebelumnya, kami sudah mempunyai persediaan yang mendengarkan acara-acara di saluran ini, jadi ia sepatutnya dapat menerima acara ini, dan kotak amaran dipaparkan kepada pengguna!

Mari kita pergi dan jalankan bagaimana anda sepatutnya menguji kes penggunaan yang telah kami bina setakat ini.

Buka URL http://your-laravel-site-domain/message/index dalam pelayar anda. Sekiranya anda belum log masuk, anda akan diarahkan semula ke skrin log masuk. Sebaik sahaja anda log masuk, anda harus melihat paparan penyiaran yang kami tentukan sebelum ini-tiada apa yang mewah lagi.

Malah, Laravel telah melakukan sedikit kerja di latar belakang yang sudah ada untuk anda. Memandangkan kami telah mendayakan tetapan Pusher.logToConsole yang disediakan oleh perpustakaan pelanggan Penolak, ia log semua dalam konsol pelayar untuk tujuan penyahpepijatan. Mari lihat apa yang sedang dilog masuk ke konsol apabila anda mengakses halaman http://laman web anda-laravel-domain/mesej/indeks.

Ia telah membuka sambungan soket web dengan pelayan soket web Pusher dan melanggan dirinya sendiri untuk mendengar peristiwa di saluran peribadi. Sudah tentu, anda boleh mempunyai nama saluran yang berbeza dalam kes anda berdasarkan ID pengguna yang anda log masuk dengan. Sekarang, mari buat halaman ini terbuka seperti yang kita bergerak untuk menguji kaedah hantar.

Seterusnya, mari buka http://your-laravel-site-domain/message/send URL dalam tab lain atau dalam pelayar yang berbeza. Sekiranya anda menggunakan pelayar yang berbeza, anda perlu log masuk untuk dapat mengakses halaman tersebut.

Sebaik sahaja anda membuka http://laman web anda-laravel-domain/mesej/hantar, anda sepatutnya dapat melihat mesej amaran di tab lain di http://your-laravel-site-domain/message/indeks.

Mari arahkan ke konsol untuk melihat apa yang baru saja berlaku.

Seperti yang dapat anda lihat, ia memberitahu anda bahawa anda baru sahaja menerima acara App\Events\NewMessageNotification dari server soket web Pusher pada saluran pribadi-pengguna.2.

Sebenarnya, anda boleh melihat apa yang berlaku di sana di akhir Penolak juga. Pergi ke akaun Penolak anda dan navigasi ke aplikasi anda. Di bawah Debug Console, anda harus dapat melihat mesej yang dilog masuk.

Pusher Dashboard

Dan itu membawa kita kepada penghujung artikel ini! Mudah-mudahan, ia tidak terlalu banyak dalam satu perjalanan kerana saya telah cuba menyederhanakan perkara dengan sebaik-baik pengetahuan saya.

Kesimpulan

Hari ini, kami melawati salah satu ciri yang paling dibincangkan mengenai Laravel-penyiaran. Ia membolehkan anda menghantar pemberitahuan masa nyata menggunakan soket web. Sepanjang perjalanan artikel ini, kami membina satu contoh dunia nyata yang menunjukkan konsep yang disebutkan di atas.

Ya, saya tahu, itu banyak perkara untuk dicerna dalam satu artikel, jadi jangan ragu untuk menggunakan suapan komen di bawah ini jika anda mendapati diri anda dalam masalah semasa pelaksanaan.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.