Scout dan Reverb mengisi dua kebutuhan yang berada di luar siklus permintaan HTTP biasa, yaitu pencarian full-text dan pembaruan data langsung ke browser. Topik ini membahas posisi kedua package tersebut pada ekosistem Laravel, cara kerja masing-masing, dan kebutuhan yang terbaca dari metadata package. Keduanya belum terpasang pada aplikasi catatan, sehingga pembahasan berpijak pada metadata serta potongan kode yang mewakili pola penggunaannya.
Posisi Scout: pencarian full-text berbasis driver#
Query where('judul', 'like', '%kata%') membandingkan potongan teks di dalam database, sehingga tidak menghasilkan peringkat relevansi dan tidak memahami variasi bentuk kata. Scout menyediakan lapisan pencarian full-text di atas model Eloquent. Deskripsi resminya menyebut solusi pencarian berbasis driver untuk model Eloquent, dan mekanismenya berjalan dua arah. Model yang menggunakan trait Searchable otomatis dimasukkan ke indeks pencarian setiap kali disimpan atau dihapus, sedangkan pemanggilan Note::search('arsip') menerjemahkan kata kunci menjadi query pada mesin pencari yang dipilih, lengkap dengan skor relevansi dan paginasi bawaannya.
Driver menentukan mesin pencari yang digunakan, dan pilihannya diatur pada config/scout.php. Tabel berikut merangkum pilihan yang diakui Scout.
| Driver | Mesin pencari | Kebutuhan tambahan |
|---|---|---|
algolia | Layanan Algolia | Package klien Algolia |
meilisearch | Server Meilisearch | Package klien Meilisearch |
typesense | Server Typesense | Package klien Typesense |
database | Database aplikasi sendiri | Tidak ada |
collection | Memori proses PHP | Tidak ada |
Kedudukan setiap driver terbaca dari metadata package tanpa pemasangan apa pun. Bagian suggests pada keluaran berikut menyebut klien untuk engine yang membutuhkannya, dan semua klien itu berada di luar requires, yang berarti Scout sendiri tetap ringan sebelum sebuah engine dipilih.
# membaca metadata package scout tanpa memasangnya
composer show laravel/scout v11.9.0 --availableNo composer.json found in the current directory, showing available packages from packagist.org
name : laravel/scout
descrip. : Laravel Scout provides a driver based solution to searching your Eloquent models.
keywords : search, laravel, algolia
versions : v11.9.0
type : library
license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
homepage :
source : [git] https://github.com/laravel/scout.git 07a6255b0cf2420426a80fd0e58a96b44afbfd40
dist : [zip] https://api.github.com/repos/laravel/scout/zipball/07a6255b0cf2420426a80fd0e58a96b44afbfd40 07a6255b0cf2420426a80fd0e58a96b44afbfd40
names : laravel/scout
support
issues : https://github.com/laravel/scout/issues
source : https://github.com/laravel/scout
autoload
psr-4
Laravel\Scout\ => src/
requires
php ^8.0
illuminate/bus ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/contracts ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/database ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/http ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/pagination ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/queue ^9.0|^10.0|^11.0|^12.0|^13.0
illuminate/support ^9.0|^10.0|^11.0|^12.0|^13.0
symfony/console ^6.0|^7.0|^8.0
requires (dev)
algolia/algoliasearch-client-php ^3.2|^4.0
typesense/typesense-php ^4.9.3
meilisearch/meilisearch-php ^1.0
mockery/mockery ^1.0
orchestra/testbench ^7.31|^8.36|^9.15|^10.8|^11.0
php-http/guzzle7-adapter ^1.0
phpstan/phpstan ^1.10
suggests
algolia/algoliasearch-client-php Required to use the Algolia engine (^3.2).
laravel/ai Required to generate embeddings for semantic and hybrid search.
meilisearch/meilisearch-php Required to use the Meilisearch engine (^1.0).
typesense/typesense-php Required to use the Typesense engine (^4.9).
conflicts
algolia/algoliasearch-client-php <3.2.0|>=5.0.0Bagian suggests memuat klien Algolia, Meilisearch, dan Typesense, ditambah laravel/ai untuk pencarian semantik, sehingga daftar pilihan engine resmi Scout terbaca langsung dari metadata. Pada sisi aplikasi, keterlibatan Scout hanya berupa satu trait pada model.
// tidak-dijalankan
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Note extends Model
{
use Searchable;
}Dengan trait tersebut, indeks pencarian diperbarui setiap kali model Note disimpan. Metadata juga memuat illuminate/queue pada requires, yang berarti pembaruan indeks dapat dijadwalkan sebagai job pada antrian, sesuai kunci queue pada konfigurasi Scout.
Sinkronisasi tidak berhenti pada penambahan data. Scout memasang observer pada model, sehingga pembaruan dan penghapusan baris juga diteruskan ke indeks, dan perubahan data tidak pernah tertinggal dari hasil pencarian. Untuk data yang sudah ada sebelum Scout dipasang, perintah scout:import membaca seluruh tabel lalu mengirimkannya ke indeks secara bertahap melalui antrian yang sama.
Posisi Reverb: server websocket untuk event#
Broadcasting adalah mekanisme Laravel untuk meneruskan event dari aplikasi ke browser secara langsung. Event yang mengimplementasikan antarmuka ShouldBroadcast mengirim payload ke layanan websocket pada saat di-dispatch, sedangkan browser yang berlangganan channel menerima payload itu tanpa memuat ulang halaman. Reverb adalah server websocket resmi Laravel yang menjalankan alur tersebut secara self-hosted, sehingga aplikasi tidak bergantung pada layanan pihak ketiga untuk komunikasi langsungnya.
Metadata package memperlihatkan fondasi teknisnya.
# membaca metadata package reverb tanpa memasangnya
composer show laravel/reverb v1.12.0 --availableNo composer.json found in the current directory, showing available packages from packagist.org
name : laravel/reverb
descrip. : Laravel Reverb provides a real-time WebSocket communication backend for Laravel applications.
keywords : websocket, real-time, WebSockets, laravel
versions : v1.12.0
type : library
license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
homepage :
source : [git] https://github.com/laravel/reverb.git e233471f53641a447d3b7a2150446d47a0e8c043
dist : [zip] https://api.github.com/repos/laravel/reverb/zipball/e233471f53641a447d3b7a2150446d47a0e8c043 e233471f53641a447d3b7a2150446d47a0e8c043
names : laravel/reverb
support
source : https://github.com/laravel/reverb/tree/v1.12.0
autoload
psr-4
Laravel\Reverb\ => src/
requires
php ^8.2
clue/redis-react ^2.6
guzzlehttp/psr7 ^2.6
illuminate/console ^10.47|^11.0|^12.0|^13.0
illuminate/contracts ^10.47|^11.0|^12.0|^13.0
illuminate/http ^10.47|^11.0|^12.0|^13.0
illuminate/support ^10.47|^11.0|^12.0|^13.0
laravel/prompts ^0.1.15|^0.2.0|^0.3.0
pusher/pusher-php-server ^7.2
ratchet/rfc6455 ^0.4
react/promise-timer ^1.10
react/socket ^1.14
symfony/console ^6.0|^7.0|^8.0
symfony/http-foundation ^6.3|^7.0|^8.0
requires (dev)
orchestra/testbench ^8.36|^9.15|^10.8|^11.0
pestphp/pest ^2.0|^3.0|^4.0
phpstan/phpstan ^1.10
ratchet/pawl ^0.4.1
react/async ^4.2
react/http ^1.9
jasonmccreary/double ~0.10Tiga dependensi pada bagian requires paling menjelaskan karakter Reverb. react/socket adalah server TCP asinkron berbasis ReactPHP, yang berarti Reverb berjalan sebagai proses PHP jangka panjang, bukan proses per permintaan. ratchet/rfc6455 menyediakan implementasi protokol websocket RFC 6455, sedangkan pusher/pusher-php-server menyatakan kompatibilitas dengan protokol Pusher, sehingga sisi browser tetap menggunakan Laravel Echo yang sudah lama berpasangan dengan protokol tersebut.
Perintah berikut menjalankan server Reverb. Prosesnya berjalan terus, dan pada server produksi pengelolaannya sama dengan worker antrian.
# tidak-dijalankan
# menjalankan server websocket Reverb, proses berjalan terus
cd ~/aplikasi-catatan
php artisan reverb:startDi sisi aplikasi, satu-satunya perubahan pada kode domain adalah menandai event sebagai siap disiarkan.
// tidak-dijalankan
namespace App\Events;
use App\Models\Note;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class PengingatDibuat implements ShouldBroadcast
{
public function __construct(public Note $note) {}
public function broadcastOn(): array
{
return [new PrivateChannel('catatan.' . $this->note->id)];
}
}Channel privat memastikan hanya browser yang berhak, yaitu yang lolos autentikasi websocket pada channel tersebut, yang menerima payload event. Persetujuan langganan channel privat diminta browser terlebih dahulu ke endpoint otorisasi Laravel, sehingga aplikasi yang sama yang mengelola data juga memutuskan hak menerima event tersebut. Alur lengkap dari event hingga browser dirangkum pada diagram berikut.
Kapan masing-masing dibutuhkan#
Scout dibutuhkan ketika pencarian harus memahami relevansi, misalnya mencari catatan dengan kata yang bentuknya bervariasi atau mengurutkan hasil berdasarkan skor. Untuk daftar kecil pada satu database, driver database sudah mencukupi tanpa layanan tambahan, sedangkan engine terkelola menjadi relevan ketika volume data dan kualitas peringkat menuntut lebih.
Reverb dibutuhkan ketika antarmuka harus terbarui segera setelah data berubah, misalnya daftar catatan yang sedang dilihat beberapa anggota tim sekaligus. Tanpa websocket, browser harus melakukan pemeriksaan berulang melalui HTTP polling, sehingga pembaruan terasa tertunda dan server menangani banyak permintaan kosong. Keduanya bersifat tambahan, yaitu aplikasi Laravel tanpa Scout maupun Reverb tetap lengkap, dan keduanya baru dipasang ketika kebutuhan masing-masing benar-benar muncul.
Ringkasan#
- Scout adalah lapisan pencarian full-text di atas model Eloquent, dengan trait
Searchablepada model dan driver yang menentukan mesin pencari, mulai dari driverdatabaselokal hingga engine terkelola. - Metadata
requiresScout hanya memuat komponenilluminate/*, sedangkan klien setiap engine berada padasuggests, sehingga pilihan engine tidak menambah beban sebelum digunakan. - Reverb adalah server websocket self-hosted berbasis ReactPHP yang menggunakan protokol Pusher, dan event yang mengimplementasikan
ShouldBroadcastmencapai browser melalui Laravel Echo. - Keduanya menambah proses di luar siklus permintaan HTTP, yaitu sinkronisasi indeks pada antrian untuk Scout dan proses server jangka panjang untuk Reverb.
Referensi#
- Laravel Scout — Laravel — Dokumentasi resmi Scout, mencakup trait Searchable, daftar driver, dan konfigurasi antrian indeks.
- Broadcasting — Laravel — Dokumentasi event, channel, dan authorized channel pada mekanisme broadcasting.
- Laravel Reverb — Laravel — Dokumentasi resmi server websocket Reverb dan integrasinya dengan Echo.