Le framework Laravel est devenu une ressource incontournable pour les développeurs qui créent des services web.
En tant qu’outil open source, Laravel offre une myriade de fonctionnalités prêtes à l’emploi qui permettent aux développeurs de créer des applications robustes et fonctionnelles.
Laravel Scout, une bibliothèque permettant de gérer les index de recherche de votre application, fait partie de ces fonctionnalités. Sa flexibilité permet aux développeurs d’affiner les configurations et de choisir parmi les pilotes Algolia, Meilisearch, MySQL ou Postgres pour stocker les index.
Ici, nous allons explorer cet outil en profondeur, en vous apprenant comment ajouter le support de la recherche textuelle à une application Laravel par le biais du pilote. Vous modéliserez une application Laravel de démonstration pour stocker le nom des trains fictifs et utiliserez ensuite Laravel Scout pour ajouter une recherche à l’application.
Conditions préalables
Pour suivre cette formation, vous devez avoir :
- Le compilateur PHP installé sur votre ordinateur. Ce tutoriel utilise la version 8.1 de PHP.
- Le moteur Docker ou Docker Desktop installé sur votre ordinateur
- Un compte cloud Algolia, que vous pouvez créer gratuitement
Comment installer Scout dans un projet Laravel
Pour utiliser Scout, vous devez d’abord créer une application Laravel dans laquelle vous avez l’intention d’ajouter la fonctionnalité de recherche. Le script Laravel-Scout Bash contient les commandes nécessaires pour générer une application Laravel dans un conteneur Docker. L’utilisation de Docker signifie que vous n’avez pas besoin d’installer des logiciels supplémentaires, comme une base de données MySQL.
Le script Laravel-scout utilise le langage de script Bash, vous devez donc l’exécuter dans un environnement Linux. Si vous utilisez Windows, assurez-vous de configurer Windows Subsystem for Linux (WSL).
Si vous utilisez WSL, exécutez la commande suivante dans votre terminal pour définir votre distribution Linux préférée.
wsl -s ubuntu
Ensuite, naviguez jusqu’à l’emplacement de votre ordinateur où vous souhaitez placer le projet. Le script Laravel-Scout générera un répertoire de projet à cet endroit. Dans l’exemple ci-dessous, le script Laravel-Scout crée un répertoire dans le répertoire du desktop.
cd /desktop
Exécutez la commande ci-dessous pour exécuter le script Laravel-Scout. Il mettra en place une application Dockerisée avec le code de base nécessaire.
curl -s https://laravel.build/laravel-scout-app | bash
Après l’exécution, changez de répertoire en utilisant cd laravel-scout-app
. Ensuite, exécutez la commande sail-up
dans le dossier du projet pour démarrer les conteneurs Docker pour votre application.
Remarque : sur de nombreuses distributions Linux, il se peut que vous deviez exécuter la commande ci-dessous avec la commande sudo
pour obtenir des privilèges élevés.
./vendor/bin/sail up
Il se peut que vous rencontriez une erreur :
Pour résoudre ce problème, utilisez la variable APP_PORT
pour spécifier un port dans la commande sail up
:
APP_PORT=3001 ./vendor/bin/sail up
Ensuite, exécutez la commande ci-dessous pour lancer l’application via Artisan sur le serveur PHP.
php artisan serve
Depuis votre navigateur web, accédez à l’application en cours d’exécution à l’adresse http://127.0.0.1:8000. L’application affichera la page de bienvenue de Laravel à la route par défaut.
Comment ajouter Laravel Scout à l’application
Dans votre terminal, saisissez la commande pour activer le gestionnaire de paquets Composer PHP afin d’ajouter Laravel Scout au projet.
composer require laravel/scout
Ensuite, publiez le fichier de configuration Scout en utilisant la commande vendor:publish. La commande publiera le fichier de configuration scout.php
dans le répertoire config de votre application.
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
Modifiez maintenant le fichier .env du modèle standard pour qu’il contienne une valeur booléenne SCOUT_QUEUE
.
La valeur SCOUT_QUEUE
permet à Scout de mettre les opérations en file d’attente, ce qui améliore les temps de réponse. Sans cette valeur, les pilotes Scout tels que Meilisearch ne refléteront pas immédiatement les nouveaux enregistrements.
SCOUT_QUEUE=true
Modifiez également la variable DB_HOST
dans le fichier .env pour qu’elle pointe vers votre localhost afin d’utiliser la base de données MySQL dans les conteneurs Docker.
DB_HOST=127.0.0.1
Comment marquer un modèle et configurer l’index
Scout n’active pas les modèles de données consultables par défaut. Vous devez explicitement marquer un modèle comme consultable en utilisant son trait Laravel\Scout\Searchable
.
Vous allez commencer par créer un modèle de données pour une application de démonstration Train
et le marquer comme consultable.
Comment créer un modèle
Pour l’application Train
, vous voudrez stocker les noms provisoires de chaque train disponible.
Exécutez la commande Artisan ci-dessous pour générer la migration et nommez-la create_trains_table
.
php artisan make:migration create_trains_table
La migration sera générée dans un fichier dont le nom combine le nom spécifié et l’horodatage actuel.
Ouvrez le fichier de migration situé dans le répertoire database/migrations/.
Pour ajouter une colonne de titre, ajoutez le code suivant après la colonne id()
à la ligne 17. Le code ajoutera une colonne de titre.
$table->string('title');
Pour appliquer la migration, exécutez la commande ci-dessous.
php artisan migrate
Après avoir exécuté les migrations de base de données, créez un fichier nommé Train.php dans le répertoire app/Models/.
Comment ajouter le trait Laravel\Scout\Searchable
Marquez le modèle Train
pour la recherche en ajoutant le trait Laravel\Scout\Searchable
au modèle, comme indiqué ci-dessous.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Train extends Model
{
use Searchable;
public $fillable = ['title'];
Vous devez également configurer les index de recherche en surchargeant la méthode searchableAS
. Le comportement par défaut de Scout persisterait le modèle pour correspondre au nom de la table du modèle.
Ajoutez donc le code suivant au fichier Train.php sous le code du bloc précédent.
/**
* Retrieve the index name for the model.
*
* @return string
*/
public function searchableAs()
{
return 'trains_index';
}
}
Comment utiliser Algolia avec Scout
Pour la première recherche en texte intégral avec Laravel Scout, vous utiliserez le pilote Algolia. Algolia est une plateforme SaaS (Software as a Service) utilisée pour effectuer des recherches dans de grandes quantités de données. Elle fournit aux développeurs un tableau de bord web pour gérer leurs index de recherche et une API robuste à laquelle vous pouvez accéder via un kit de développement logiciel (SDK) dans votre langage de programmation préféré.
Dans l’application Laravel, vous utiliserez le paquet client Algolia pour PHP.
Comment configurer Algolia
Tout d’abord, vous devez installer le package client de recherche Algolia PHP pour votre application.
Exécutez la commande ci-dessous.
composer require algolia/algoliasearch-client-php
Ensuite, vous devez définir votre ID d’application et votre clé API secrète d’Algolia dans le fichier .env.
En utilisant votre navigateur web, naviguez vers votre tableau de bord Algolia pour obtenir les identifiants Application ID et Secret API Key.
Cliquez sur Setting en bas de la colonne latérale de gauche pour accéder à la page Settings.
Ensuite, cliquez sur API Keys dans la section Team and Access de la page Settings pour afficher les clés de votre compte Algolia.
Sur la page API Keys, notez les valeurs Application ID et Admin API Key. Vous utiliserez ces informations d’identification pour authentifier la connexion entre l’application Laravel et Algolia.
Ajoutez le code ci-dessous à votre fichier .env à l’aide de votre éditeur de code et remplacez les espaces réservés par les secrets API Algolia correspondants.
ALGOLIA_APP_ID=APPLICATION_ID
ALGOLIA_SECRET=ADMIN_API_KEY
Remplacez également la variable SCOUT_DRIVER
par le code ci-dessous pour changer la valeur de meilisearch
à algolia
. Le changement de cette valeur demandera à Scout d’utiliser le pilote Algolia.
SCOUT_DRIVER=algolia
Comment créer les contrôleurs d’application
Dans le répertoire app/Http/Controllers/, créez un fichier TrainSearchController.php pour stocker un contrôleur pour l’application. Le contrôleur listera et ajoutera des données au modèle Train
.
Ajoutez le bloc de code suivant dans le fichier TrainSearchController.php pour construire le contrôleur.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Models\Train;
class TrainSearchController extends Controller
{
/**
* Compile the content for a trains list view.
*
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function index(Request $request)
{
if($request->has('titlesearch')){
$trains = Train::search($request->titlesearch)
->paginate(6);
}else{
$trains = Train::paginate(6);
}
return view('Train-search',compact('trains'));
}
/**
* Create a new train entry.
*
* @return \Illuminate\Http\RedirectResponse
*/
public function create(Request $request)
{
$this->validate($request,['title'=>'required']);
$trains = Train::create($request->all());
return back();
}
}
Comment créer les routes de l’application
Dans cette étape, vous allez créer les routes pour lister et ajouter de nouveaux trains à la base de données.
Ouvrez votre fichier routes/web.php et remplacez le code existant par le bloc ci-dessous.
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\TrainSearchController;
Route::get('/', function () {
return view('welcome');
});
Route::get('trains-lists', [TrainSearchController::class, 'index']) -> name ('trains-lists');
Route::post('create-item', [TrainSearchController::class, 'create']) -> name ('create-item');
Le code ci-dessus définit deux routes dans l’application. La requête GET
pour l’itinéraire /trains-lists
répertorie toutes les données de train stockées. La requête POST
pour la route /create-item
crée de nouvelles données sur les trains.
Comment créer les vues de l’application
Créez un fichier dans le répertoire resources/views/ et nommez-le Train-search.blade.php. Ce fichier affichera l’interface utilisateur de la fonctionnalité de recherche.
Ajoutez le contenu du bloc de code ci-dessous dans le fichier Train-search.blade.php pour créer une page unique pour la fonctionnalité de recherche.
<!DOCTYPE html>
<html>
<head>
<title>Laravel - Laravel Scout Algolia Search Example</title>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h2 class="text-bold">Laravel Full-Text Search Using Scout </h2><br/>
<form method="POST" action="{{ route('create-item') }}" autocomplete="off">
@if(count($errors))
<div class="alert alert-danger">
<strong>Whoops!</strong> There is an error with your input.
<br/>
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="row">
<div class="col-md-6">
<div class="form-group {{ $errors->has('title') ? 'has-error' : '' }}">
<input type="text" id="title" name="title" class="form-control" placeholder="Enter Title" value="{{ old('title') }}">
<span class="text-danger">{{ $errors->first('title') }}</span>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<button class="btn btn-primary">Create New Train</button>
</div>
</div>
</div>
</form>
<div class="panel panel-primary">
<div class="panel-heading">Train Management</div>
<div class="panel-body">
<form method="GET" action="{{ route('trains-lists') }}">
<div class="row">
<div class="col-md-6">
<div class="form-group">
<input type="text" name="titlesearch" class="form-control" placeholder="Enter Title For Search" value="{{ old('titlesearch') }}">
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<button class="btn btn-primary">Search</button>
</div>
</div>
</div>
</form>
<table class="table">
<thead>
<th>Id</th>
<th>Train Title</th>
<th>Creation Date</th>
<th>Updated Date</th>
</thead>
<tbody>
@if($trains->count())
@foreach($trains as $key => $item)
<tr>
<td>{{ ++$key }}</td>
<td>{{ $item->title }}</td>
<td>{{ $item->created_at }}</td>
<td>{{ $item->updated_at }}</td>
</tr>
@endforeach
@else
<tr>
<td colspan="4">No train data available</td>
</tr>
@endif
</tbody>
</table>
{{ $trains->links() }}
</div>
</div>
</div>
</body>
</html>
Le code HTML ci-dessus contient un élément de formulaire avec un champ de saisie et un bouton pour saisir le titre d’un train avant de l’enregistrer dans la base de données. Le code contient également un tableau HTML affichant id, title, created_at et updated_at d’une entrée de train dans la base de données.
Comment utiliser la recherche Algolia
Pour afficher la page, naviguez vers http://127.0.0.1:8000/trains-lists à partir de votre navigateur web.
La base de données est actuellement vide, vous devez donc saisir le titre d’un train de démonstration dans le champ de saisie et cliquer sur Créer un nouveau train pour l’enregistrer.
Pour utiliser la fonction de recherche, saisissez un mot-clé parmi les titres de train enregistrés dans le champ de saisie Saisir le titre pour la recherche et cliquez sur Rechercher.
Comme le montre l’image ci-dessous, seules les entrées de recherche contenant le mot-clé dans leur titre s’afficheront.
Meilisearch avec Laravel Scout
Meilisearch est un moteur de recherche open source axé sur la vitesse, la performance et l’amélioration de l’expérience des développeurs. Il partage plusieurs fonctionnalités avec Algolia, utilisant les mêmes algorithmes, structures de données et recherches – mais avec un langage de programmation différent.
Les développeurs peuvent créer et héberger eux-mêmes une instance de Meilisearch dans leur infrastructure sur site ou dans le cloud. Meilisearch propose également une offre bêta similaire à Algolia pour les développeurs qui souhaitent utiliser le produit sans en gérer l’infrastructure.
Dans ce tutoriel, vous disposez déjà d’une instance locale de Meilisearch fonctionnant dans vos conteneurs Docker. Vous allez maintenant étendre la fonctionnalité Laravel Scout pour utiliser l’instance Meilisearch.
Pour ajouter Meilisearch à l’application Laravel, exécutez la commande ci-dessous dans le terminal de votre projet.
composer require meilisearch/meilisearch-php
Ensuite, vous devez modifier les variables de Meilisearch dans le fichier .env pour le configurer.
Remplacez les variables SCOUT_DRIVER
, MEILISEARCH_HOST
, et MEILISEARCH_KEY
dans le fichier .env par les variables ci-dessous.
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=LockKey
La clé SCOUT_DRIVER
spécifie le pilote que Scout doit utiliser, tandis que MEILISEARCH_HOST
représente le domaine dans lequel votre instance de Meilisearch est exécutée. Bien que cela ne soit pas nécessaire pendant le développement, il est recommandé d’ajouter MEILISEARCH_KEY
en production.
Remarque : Mettez en commentaire l’ID et le secret Algolia lorsque vous utilisez Meilisearch comme pilote préféré.
Après avoir terminé les configurations .env, vous devez indexer vos enregistrements préexistants à l’aide de la commande Artisan ci-dessous.
php artisan scout:import "App\Models\Train"
Laravel Scout avec le moteur de base de données
Le moteur de base de données de Scout est plus adapté aux applications qui utilisent des bases de données plus petites ou qui gèrent des charges de travail moins intensives. Actuellement, le moteur de base de données supporte PostgreSQL et MySQL.
Ce moteur utilise des clauses de type « where-like » et des index plein texte sur votre base de données existante, ce qui lui permet de trouver les résultats de recherche les plus pertinents. Vous n’avez pas besoin d’indexer vos enregistrements lorsque vous utilisez le moteur de base de données.
Pour utiliser le moteur de base de données, vous devez définir votre variable SCOUT_DRIVER
.env sur la base de données.
Ouvrez le fichier . env dans l’application Laravel et modifiez la valeur de la variable SCOUT_DRIVER
.
SCOUT_DRIVER = database
Après avoir changé votre pilote pour la base de données, Scout utilisera le moteur de base de données pour la recherche en texte intégral.
Moteur de collecte avec Laravel Scout
En plus du moteur de base de données, Scout propose également un moteur de collecte. Ce moteur utilise les clauses « where » et le filtrage des collections pour extraire les résultats de recherche les plus pertinents.
Contrairement au moteur de base de données, le moteur de collecte prend en charge toutes les bases de données relationnelles que Laravel prend également en charge.
Vous pouvez utiliser le moteur de collecte en définissant la variable d’environnement SCOUT_DRIVER
sur collection
ou en spécifiant manuellement le pilote de collecte dans le fichier de configuration de Scout.
SCOUT_DRIVER = collection
Explorer avec Elasticsearch
Avec la force des requêtes Elasticsearch, Explorer est un pilote Elasticsearch moderne pour Laravel Scout. Il offre un pilote Scout compatible et des avantages tels que le stockage, la recherche et l’analyse de quantités massives de données en temps réel. Elasticsearch avec Laravel offre des résultats en quelques millisecondes.
Pour utiliser le pilote Elasticsearch Explorer dans votre application Laravel, vous devrez configurer le fichier boilerplate docker-compose.yml que le script Laravel-Scout a généré. Vous ajouterez les configurations supplémentaires pour Elasticsearch et redémarrerez les conteneurs.
Ouvrez votre fichier docker-compose.yml et remplacez son contenu par ce qui suit.
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
- '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
- redis
- meilisearch
- mailhog
- selenium
- pgsql
- elasticsearch
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
- './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
elasticsearch:
image: 'elasticsearch:7.13.4'
environment:
- discovery.type=single-node
ports:
- '9200:9200'
- '9300:9300'
volumes:
- 'sailelasticsearch:/usr/share/elasticsearch/data'
networks:
- sail
kibana:
image: 'kibana:7.13.4'
environment:
- elasticsearch.hosts=http://elasticsearch:9200
ports:
- '5601:5601'
networks:
- sail
depends_on:
- elasticsearch
redis:
image: 'redis:alpine'
ports:
- '${FORWARD_REDIS_PORT:-6379}:6379'
volumes:
- 'sail-redis:/data'
networks:
- sail
healthcheck:
test: ["CMD", "redis-cli", "ping"]
retries: 3
timeout: 5s
pgsql:
image: 'postgres:13'
ports:
- '${FORWARD_DB_PORT:-5432}:5432'
environment:
PGPASSWORD: '${DB_PASSWORD:-secret}'
POSTGRES_DB: '${DB_DATABASE}'
POSTGRES_USER: '${DB_USERNAME}'
POSTGRES_PASSWORD: '${DB_PASSWORD:-secret}'
volumes:
- 'sailpgsql:/var/lib/postgresql/data'
networks:
- sail
healthcheck:
test: ["CMD", "pg_isready", "-q", "-d", "${DB_DATABASE}", "-U", "${DB_USERNAME}"]
retries: 3
timeout: 5s
meilisearch:
image: 'getmeili/meilisearch:latest'
ports:
- '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
volumes:
- 'sail-meilisearch:/meili_data'
networks:
- sail
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"]
retries: 3
timeout: 5s
mailhog:
image: 'mailhog/mailhog:latest'
ports:
- '${FORWARD_MAILHOG_PORT:-1025}:1025'
- '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
networks:
- sail
selenium:
image: 'selenium/standalone-chrome'
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
- '/dev/shm:/dev/shm'
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sail-mysql:
driver: local
sail-redis:
driver: local
sail-meilisearch:
driver: local
sailpgsql:
driver: local
sailelasticsearch:
driver: local
Ensuite, exécutez la commande ci-dessous pour extraire la nouvelle image Elasticsearch que vous avez ajoutée au fichier docker-compose.y ml.
docker-compose up
Ensuite, exécutez la commande Composer ci-dessous pour installer Explorer dans le projet.
composer require jeroen-g/explorer
Vous devez également créer un fichier de configuration pour le pilote Explorer.
Exécutez la commande Artisan ci-dessous pour générer un fichier explorer.config afin de stocker les configurations.
php artisan vendor:publish --tag=explorer.config
Le fichier de configuration généré ci-dessus sera disponible dans le répertoire /config.
Dans votre fichier config/explorer.php, vous pouvez référencer votre modèle en utilisant la clé indexes
.
'indexes' => [
\App\Models\Train::class
],
Changez la valeur de la variable SCOUT_DRIVER
dans le fichier .env en elastic
pour configurer Scout afin qu’il utilise le pilote Explorer.
SCOUT_DRIVER = elastic
À ce stade, vous utiliserez Explorer dans le modèle Train
en implémentant l’interface Explorer et en surchargeant la méthode mappableAs()
.
Ouvrez le fichier Train.php dans le répertoire App\Models et remplacez le code existant par le code ci-dessous.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use JeroenG\Explorer\Application\Explored;
use Laravel\Scout\Searchable;
class Train extends Model implements Explored
{
use HasFactory;
use Searchable;
protected $fillable = ['title'];
public function mappableAs(): array
{
return [
'id'=>$this->Id,
'title' => $this->title,
];
}
}
Avec le code que vous avez ajouté ci-dessus, vous pouvez maintenant utiliser Explorer pour rechercher du texte dans le modèle Train
.
Résumé
Pour les développeurs PHP, Laravel et les modules comme Scout facilitent l’intégration d’une fonctionnalité de recherche textuelle rapide et robuste. Avec le moteur de base de données, le moteur de collection et les capacités de Meilisearch et Elasticsearch, vous pouvez interagir avec la base de données de votre application et mettre en œuvre des mécanismes de recherche avancés en quelques millisecondes.
La gestion et la mise à jour transparentes de votre base de données permettent à vos utilisateurs de bénéficier d’une expérience optimale, tandis que votre code reste propre et efficace.
Avec nos solutions d’hébergement d’applications et de bases de données, Kinsta est votre guichet unique pour tous vos besoins en développement Laravel moderne. Les premiers 20 $ sont pour nous.
Laisser un commentaire