3
0
Files
pcm-search-bundle/README.md
T
2026-05-07 17:29:31 +01:00

87 lines
2.0 KiB
Markdown

# 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]`.