Installation:
composer require chebur/search-bundle
Enable the bundle in config/bundles.php (Symfony) or AppKernel.php (legacy):
Chebur\SearchBundle\CheburSearchBundle::class => ['all' => true],
First Use Case:
Define a searchable entity (e.g., Product) with annotations:
use Chebur\SearchBundle\Annotation\Searchable;
use Chebur\SearchBundle\Annotation\SearchField;
/**
* @Searchable
*/
class Product
{
/**
* @SearchField(type="text")
*/
private $name;
/**
* @SearchField(type="number")
*/
private $price;
}
Basic Search Query:
use Chebur\SearchBundle\Search\SearchQuery;
$query = new SearchQuery(Product::class);
$query->addFilter('name', 'laptop'); // Text search
$query->addFilter('price', ['min' => 500, 'max' => 1000]); // Range filter
$results = $query->execute();
Search Query Construction:
SearchQuery builder for dynamic queries:
$query = (new SearchQuery(Product::class))
->setPage(2)
->setLimit(10)
->addSort('price', 'desc');
Pagination:
setPage()/setLimit().$results = $query->execute(); // Returns array of entities + metadata
$totalItems = $results['metadata']['total'];
Filtering:
addFilter('field', 'term') (partial matches).addFilter('field', ['min' => X, 'max' => Y]).addFilter('field', ['exact' => 'value']).addFilter('tags', ['in' => ['php', 'laravel']]).Sorting:
$query->addSort('created_at', 'desc');
$query->addSort('name', 'asc');
Integration with Controllers:
public function search(Request $request)
{
$query = new SearchQuery(Product::class);
$query->addFilter('name', $request->get('q'));
$query->addSort('name', 'asc');
$results = $query->execute();
return view('products.index', compact('results'));
}
Form Integration:
$form = $this->createFormBuilder()
->add('q', TextType::class, ['label' => 'Search'])
->add('price_min', NumberType::class)
->add('price_max', NumberType::class)
->getForm();
Annotation Caching:
@Searchable or @SearchField, clear cache:
php bin/console cache:clear
php bin/console chebur:search:debug to validate annotations.Case Sensitivity:
# config/packages/chebur_search.yaml
chebur_search:
default_search_options:
case_sensitive: true
Performance:
tsvector).Symfony\Contracts\Cache\CacheInterface).Field Type Mismatches:
@SearchField(type="...") matches the actual field type (e.g., text, number, date).php bin/console chebur:search:debug Product
Pagination Offsets:
setLimit() + setPage() values may cause timeouts. Optimize with:
$query->setLimit(50); // Max recommended
Query Logging:
Enable SQL logging in .env:
APP_DEBUG=true
DATABASE_LOG_QUERIES=true
Validate Annotations:
php bin/console chebur:search:debug EntityName
Check Config:
Override defaults in config/packages/chebur_search.yaml:
chebur_search:
default_search_options:
limit: 20
page: 1
Custom Field Types:
Extend Chebur\SearchBundle\Search\FieldType\AbstractFieldType for custom logic (e.g., geospatial).
Query Builders:
Override Chebur\SearchBundle\Search\QueryBuilder for database-specific optimizations.
Event Listeners:
Listen to chebur.search.query events to modify queries dynamically:
use Chebur\SearchBundle\Event\SearchQueryEvent;
$dispatcher->addListener(SearchQueryEvent::class, function (SearchQueryEvent $event) {
$event->getQuery()->addFilter('active', true);
});
Result Transformers:
Use Chebur\SearchBundle\Search\ResultTransformerInterface to alter returned data:
$query->setTransformer(new CustomTransformer());
How can I help you explore Laravel packages today?