Le framework Laravel s’est solidement établi comme une ressource incontournable pour les développeurs de services web. Avec ses fonctionnalités prêtes à l’emploi, Laravel offre un environnement propice à la création d’applications robustes et fonctionnelles. Parmi ces fonctionnalités, Laravel Scout se distingue en tant que bibliothèque permettant de gérer les index de recherche d’une application. Sa polyvalence offre aux développeurs la liberté de configurer des options telles que les pilotes Algolia, Meilisearch, MySQL ou Postgres pour stocker les index, adaptant ainsi la recherche à leurs besoins spécifiques.
Sommaire
Mise en Place de Laravel Scout : conditions préalables
Avant d’explorer Laravel Scout, assurez-vous d’avoir les éléments suivants sur votre machine :
- Le compilateur PHP installé, de préférence la version 8.1.
- Le moteur Docker ou Docker Desktop pour faciliter la gestion des conteneurs.
- Un compte sur Algolia, une plateforme cloud de recherche.
Installation de Scout dans un projet Laravel
La première étape pour utiliser Scout consiste à créer une application Laravel. Un script Bash, nommé Laravel-Scout, est disponible pour générer une application Laravel dans un conteneur Docker, éliminant ainsi le besoin d’installations supplémentaires, comme une base de données MySQL. Pour les utilisateurs Windows, assurez-vous d’avoir configuré Windows Subsystem for Linux (WSL).
Si WSL est en place, exécutez la commande suivante dans votre terminal pour définir votre distribution Linux préférée :
bash
Copy code
wsl -s ubuntu
Ensuite, naviguez vers l’emplacement souhaité pour votre projet et exécutez le script Laravel-Scout avec la commande suivante :
bash
Copy code
cd /desktop
curl -s https://laravel.build/laravel-scout-app | bash
Après cela, dirigez-vous vers le répertoire du projet et lancez les conteneurs Docker avec la commande suivante :
bash
Copy code
./vendor/bin/sail up
Si une erreur survient, spécifiez un port avec la variable APP_PORT :
bash
Copy code
APP_PORT=3001 ./vendor/bin/sail up
Enfin, lancez l’application via Artisan avec :
bash
Copy code
php artisan serve
Configuration de Laravel Scout dans l’application
Dans votre terminal, activez le gestionnaire de paquets Composer avec la commande suivante pour ajouter Laravel Scout à votre projet :
bash
Copy code
composer require laravel/scout
Ensuite, publiez le fichier de configuration de Scout avec la commande :
bash
Copy code
php artisan vendor:publish –provider=”Laravel\Scout\ScoutServiceProvider”
Modifiez le fichier .env pour ajouter la variable booléenne SCOUT_QUEUE :
env
Copy code
SCOUT_QUEUE=true
Également dans le fichier .env, ajustez la variable DB_HOST pour qu’elle pointe vers votre localhost :
env
Copy code
DB_HOST=127.0.0.1
Marquage d’un modèle pour la recherche et configuration de l’index
Scout n’active pas par défaut les modèles pour la recherche, il est nécessaire de les marquer explicitement avec le trait Laravel\Scout\Searchable. Nous allons créer un modèle pour une application de démonstration de trains, stockant les noms fictifs des trains disponibles.
Générez la migration avec la commande :
bash
Copy code
php artisan make:migration create_trains_table
Ouvrez la migration générée dans le répertoire database/migrations/ et ajoutez une colonne de titre :
php
Copy code
$table->string(‘title’);
Appliquez ensuite la migration avec :
bash
Copy code
php artisan migrate
Créez un fichier Train.php dans le répertoire app/Models/ et marquez le modèle comme searchable :
php
Copy code
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;
class Train extends Model
{
use Searchable;
public $fillable = [‘title’];
public function searchableAs()
{
return ‘trains_index’;
}
}
Utilisation d’Algolia avec Scout : configuration
Nous utiliserons le pilote Algolia pour notre première recherche en texte intégral avec Laravel Scout. Commencez par installer le client Algolia PHP :
bash
Copy code
composer require algolia/algoliasearch-client-php
Ajoutez vos identifiants Algolia dans le fichier .env. Récupérez ces informations depuis votre tableau de bord Algolia, dans la section API Keys :
env
Copy code
ALGOLIA_APP_ID=APPLICATION_ID
ALGOLIA_SECRET=ADMIN_API_KEY
SCOUT_DRIVER=algolia
Création des contrôleurs d’application
Dans le répertoire app/Http/Controllers/, créez le fichier TrainSearchController.php pour gérer les fonctionnalités de recherche. Ce contrôleur listera et ajoutera des données au modèle Train.
Ajoutez le code suivant dans TrainSearchController.php :
php
Copy code
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Models\Train;
class TrainSearchController extends Controller
{
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’));
}
public function create(Request $request)
{
$this->validate($request,[‘title’=>’required’]);
$trains = Train::create($request->all());
return back();
}
}
Cette première partie couvre la mise en place de Laravel Scout, la configuration avec Algolia, et la préparation de notre modèle pour la recherche. La suite de cet article explorera l’utilisation concrète de la recherche textuelle dans une application Laravel.
Création des routes et des vues de l’application
Configuration des routes
La mise en place des routes dans une application Laravel est essentielle pour définir la logique de navigation. Dans cette étape, nous allons créer les routes nécessaires pour lister les trains et ajouter de nouveaux éléments à la base de données.
Ouvrez le fichier routes/web.php et remplacez son contenu par le code suivant :
php
Copy code
<?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éclare deux routes dans l’application. La première, une requête GET vers /trains-lists, permet de lister toutes les données de train stockées. La seconde, une requête POST vers /create-item, crée de nouvelles données sur les trains.
Création des vues
La création d’une interface utilisateur claire et fonctionnelle est cruciale. Dans cette section, nous allons créer une vue nommée Train-search.blade.php dans le répertoire resources/views/. Cette vue affichera l’interface utilisateur pour la fonctionnalité de recherche.
Ajoutez le contenu du bloc de code suivant dans le fichier Train-search.blade.php :
html
Copy code
<!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 crée une page avec un formulaire pour saisir le titre d’un train avant de l’enregistrer dans la base de données. Il inclut également un tableau affichant id, title, created_at et updated_at des trains dans la base de données.
Utilisation de la recherche Algolia
Pour visualiser la page, accédez à http://127.0.0.1:8000/trains-lists depuis votre navigateur web. Comme la base de données est actuellement vide, saisissez le titre d’un train de démonstration dans le champ de saisie et cliquez sur “Create New Train” pour l’enregistrer.
Pour utiliser la fonction de recherche, entrez un mot-clé parmi les titres des trains enregistrés dans le champ “Enter Title For Search” et cliquez sur “Search”. Seules les entrées contenant le mot-clé dans leur titre seront affichées.
Meilisearch avec Laravel Scout
Meilisearch, moteur de recherche open source axé sur la vitesse et la performance, offre une alternative à Algolia. Bien qu’utilisant des technologies similaires, Meilisearch permet aux développeurs de gérer leur propre instance, que ce soit localement ou dans le cloud.
Pour intégrer Meilisearch à l’application Laravel, exécutez la commande suivante dans le terminal de votre projet :
bash
Copy code
composer require meilisearch/meilisearch-php
Ensuite, modifiez les variables de Meilisearch dans le fichier .env pour le configurer :
env
Copy code
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://127.0.0.1:7700
MEILISEARCH_KEY=LockKey
La variable SCOUT_DRIVER spécifie le pilote que Scout doit utiliser, MEILISEARCH_HOST représente le domaine de votre instance Meilisearch, et MEILISEARCH_KEY (recommandé en production) assure la sécurité de votre instance.
Après ces configurations, indexez vos enregistrements existants avec la commande Artisan :
bash
Copy code
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 idéal pour les applications gérant des bases plus petites. Actuellement, il prend en charge PostgreSQL et MySQL. Pour utiliser ce moteur, modifiez la variable SCOUT_DRIVER dans le fichier .env :
env
Copy code
SCOUT_DRIVER=database
Avec cette configuration, Scout utilisera le moteur de base de données pour la recherche en texte intégral, simplifiant ainsi le processus sans nécessiter l’indexation des enregistrements.
En suivant ces étapes, vous avez exploré la configuration initiale de Laravel Scout avec Algolia, Meilisearch, et le moteur de base de données, tout en créant les routes et les vues nécessaires pour une application de recherche textuelle.
Extension des capacités avec Laravel Scout
Moteur de collecte Laravel Scout
Outre le moteur de base de données, Laravel Scout offre une alternative puissante appelée le moteur de collecte. Ce moteur utilise des clauses “where” et le filtrage des collections pour extraire des résultats de recherche pertinents. Une caractéristique distincte du moteur de collecte est sa compatibilité avec toutes les bases de données relationnelles prises en charge par Laravel.
Pour activer le moteur de collecte, vous pouvez définir la variable d’environnement SCOUT_DRIVER sur “collection” ou spécifier manuellement le pilote de collecte dans le fichier de configuration de Scout.
env
Copy code
SCOUT_DRIVER=collection
Exploration avec Elasticsearch
Explorer, un pilote Elasticsearch moderne pour Laravel Scout, tire parti de la puissance des requêtes Elasticsearch. Il offre des avantages tels que le stockage, la recherche et l’analyse de quantités massives de données en temps réel, fournissant des résultats en quelques millisecondes. Elasticsearch avec Laravel est une combinaison puissante pour des performances optimales.
Pour intégrer le pilote Elasticsearch Explorer dans votre application Laravel, vous devez configurer le fichier docker-compose.yml généré par le script Laravel-Scout. Ajoutez les configurations nécessaires pour Elasticsearch et redémarrez les conteneurs.
yaml
Copy code
# docker-compose.yml
version: ‘3’
services:
# … (autres services)
elasticsearch:
image: ‘elasticsearch:7.13.4’
environment:
– discovery.type=single-node
ports:
– ‘9200:9200’
– ‘9300:9300’
volumes:
– ‘sailelasticsearch:/usr/share/elasticsearch/data’
networks:
– sail
Assurez-vous de lancer la commande suivante pour extraire la nouvelle image Elasticsearch ajoutée au fichier docker-compose.yml.
bash
Copy code
docker-compose up
Ensuite, installez Explorer dans votre projet avec Composer.
bash
Copy code
composer require jeroen-g/explorer
Créez un fichier de configuration pour le pilote Explorer en exécutant la commande artisan suivante.
bash
Copy code
php artisan vendor:publish –tag=explorer.config
Le fichier de configuration généré sera disponible dans le répertoire /config. Référencez votre modèle dans ce fichier config/explorer.php en utilisant la clé indexes.
php
Copy code
‘indexes’ => [
\App\Models\Train::class
],
Modifiez la variable SCOUT_DRIVER dans le fichier .env pour configurer Scout avec le pilote Explorer.
env
Copy code
SCOUT_DRIVER=elastic
Maintenant, vous pouvez utiliser Explorer dans le modèle Train en implémentant l’interface Explorer et en surchargeant la méthode mappableAs().
php
Copy code
<?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 ces ajustements, vous pouvez désormais tirer parti du puissant moteur de collecte de Scout et explorer vos données avec Elasticsearch, offrant des fonctionnalités avancées de recherche et d’analyse.