nano /var/log/random.log

Coding, life & stuff.
#Laravel

Crear un búscador con Laravel y spatie/laravel-searchable.


Si, hay muchos tutoriales en internet sobre esto pero esta vez será algo rápido de implementar ;)

Ok, recientemente he estado trabajando en una aplicación que llegó a un punto que necesitaba un búscador.

Claro, existen cosas como Laravel Scout pero por ser un MVP el proyecto no cuenta con un budget que permita invertir en algolia.

Entonces, búscando siempre en los paquetes creados por la comunidad resaltan los de spatie, sus paquetes me han ayudado a resolver problemas de una forma mucho más rápida y eficiente.

El paquete que necesité para esto es:

composer require spatie/laravel-searchable

La configuración de este paquete es sencilla, solo requiere que implementemos la interfaz Searchable en el modelo a usar, de la siguiente forma:

<?php
namespace App\Models;
use Spatie\Searchable\Searchable;
use Spatie\Searchable\SearchResult;
use Illuminate\Database\Eloquent\Model;

class Post extends Model implements Searchable
{
    // other stuff

    public function getSearchResult(): SearchResult
    {
       return new SearchResult($this, $this->title, route('front.post.show', $this->slug));
    }
}

Acá básicamente lo que estamos haciendo es crear una nueva instancia de SearchResult dónde le pasamos como parámetros: el modelo en si mismo, el título y la url del recurso.

Ahora creamos un controlador para poder tener acceso a la data desde nuestro frontend usando (por ejemplo) VueJS / ReactJS, Axios o Ajax. En mi caso, usé un Single Action Controller de la siguiente forma:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use Spatie\Searchable\Search;
use App\Http\Controllers\Controller;

class ShowProfile extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function __invoke(Request $request)
    {
        $response = (new Search())
            ->registerModel(Post::class, ['title'])
            ->search($request->search'));

        return response()->json($response);
    }
}

Ya lo unico que queda es crear una ruta:

Route::get('/search', 'Front\Search\SearchController')->name('front.search');

NOTA: este post es básicamente una traducción del readme del paquete spatie/laravel-searchable. Para más info, vayan al repo.

Articulos relacionados

#Arduino Uno

Arduino Uno con ¿javascript?

Si, podemos controlar un arduino con javascript usando johnny-five (aunque hay otras herramientas disponibles). Johnny Five es una gran herramienta que nos permite hacer cosas interesantes con nuestro arduino usando javascript de una forma muy sencilla y entretenida.