diff --git a/README.md b/README.md index e69de29..3297b44 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,86 @@ +# PCM Search Bundle + +Provides a search system for Symfony projects. + +## Installation + +Add the repo to your `composer.json` file: +```json + +"repositories": [ + { + "type": "vcs", + "url": "https://git.pcmdev.co.uk/pcm-libraries/pcm-search-bundle.git" + } +] +``` + +Then install the bundle via Composer: + +```sh +composer require pcm/search-bundle +``` + +## Usage + +Make any entity searchable by implementing `SearchableInterface`. The bundle's `SearchService` will then index, re-index, and remove entries automatically via Doctrine event subscribers. + +To (re)build the index for all searchable entities, run: + +```sh +php bin/console pcm:search:reindex +``` + +Inject `Pcm\SearchBundle\Service\SearchService` into your own services to query, index, or un-index entities programmatically. + +### Adding a search bar + +Make your entity searchable by implementing `SearchableInterface`: + +```php +use Pcm\SearchBundle\Interface\SearchableInterface; + +#[ORM\Entity] +class Company implements SearchableInterface +{ + public function getSearchTitle(): string + { + return $this->name; + } + + public function getSearchValues(): array + { + return [ + $this->name, + $this->website + ]; + } +} +``` + +Query the index from a controller and resolve each hit to a URL: + +```php +#[Route('/search', name: 'app_search', methods: ['GET'])] +public function search(Request $request, SearchIndexRepository $repo): Response +{ + $routes = [Company::class => 'app_company_show']; + $rows = $repo->findAllPagination($request->query->get('q', ''))->getResult(); + + $results = []; + foreach ($rows as [$index]) { + $route = $routes[$index->getEntityClass()] ?? null; + if ($route === null) { + continue; + } + $results[] = [ + 'title' => $index->getTitle(), + 'url' => $this->generateUrl($route, ['id' => $index->getEntityId()]), + ]; + } + + return $this->render('search/_results.html.twig', ['results' => $results]); +} +``` + +Each row from `findAllPagination()` is `[SearchIndex $hit, 'score' => float]`.