atoolo/graphql-search-bundle
Installation:
composer require sitepark/atoolo-graphql-search-bundle
Add to config/bundles.php:
return [
// ...
Sitepark\Atoolo\GraphQLSearchBundle\AtooloGraphQLSearchBundle::class => ['all' => true],
];
First Use Case: Query the GraphQL API with search-specific fields. Example:
query SearchQuery {
search(
query: "example"
filters: { source: ["news"] }
limit: 10
) {
results {
id
headline
teaser {
... on MediaTeaser {
symbolicAsset {
url
}
}
}
}
}
}
Key Documentation:
Search Query Construction:
search root field with input arguments:
search(
query: String!
filters: InputFilter
limit: Int
offset: Int
sort: [SortCriteria!]
facets: [Facet!]
)
AND/OR logic:
filters: {
and: [
{ source: ["news"] },
{ dateRange: { from: "2023-01-01", to: "2023-12-31" } }
]
}
Teaser-Specific Resolvers:
MediaTeaser, NewsTeaser):
teaser {
... on MediaTeaser {
symbolicAsset { url variant }
kicker
}
... on NewsTeaser {
dateTime
kicker
}
}
Faceted Navigation:
facets for dynamic filtering:
facets: [
{ type: "source" },
{ type: "dateRange", from: "2023-01-01", to: "2023-12-31" }
]
Sorting:
SortCriteria:
sort: [
{ field: "relevance" },
{ field: "dateTime", direction: DESC }
]
Server-Side Execution:
atoolo_graphql_search.yaml):
server_side_execution: true
Dependency Injection:
atoolo.graphql_search.resolver:
services:
App\GraphQL\Search\CustomResolver:
tags: ['atoolo.graphql_search.resolver']
Custom Factories:
SortCriteriaFactoryInterface for custom sorts:
class CustomSortFactory implements SortCriteriaFactoryInterface {
public function create(array $input): SortCriteria { ... }
}
URL Rewriting:
urlBasePath in queries for dynamic URL handling:
query {
search(query: "example", urlBasePath: "/custom-path") { ... }
}
Pagination:
limit/offset for client-side pagination or leverage cursor-based pagination if supported.Deprecation Warnings:
symbolicImage → Use symbolicAsset (type Asset) instead.opensNewWindow → Removed in v1.1.0; use accessibilityLabel for alternatives.Geo-Spatial Queries:
geoLocatedFilter is optional in InputFilter (not required):
filters: {
geoLocated: { latitude: 48.1351, longitude: 11.5820, radius: 10 }
}
Server-Side Execution:
atoolo/search-bundle v1.13.0+. Enable via config:
atoolo_graphql_search:
server_side_execution: true
Teaser Resolvers:
NewsTeaserFactory):
services:
Sitepark\Atoolo\GraphQLSearchBundle\Factory\NewsTeaserFactory: ~
Date Range Facets:
baseOffset for relative date ranges:
facets: [
{ type: "dateRange", from: "-30d", to: "now", baseOffset: "2023-01-01" }
]
Explain Mode:
explain: true in queries to analyze result scoring:
search(query: "example", explain: true) { ... }
PHP Warnings:
symbolicAsset['content']):
// Fix: Ensure asset data structure matches expectations.
$asset = $result->getSymbolicAsset();
$url = $asset['content']['url'] ?? null;
Empty GeoJSON:
Custom Sort Criteria:
SortCriteriaFactory for domain-specific sorts (e.g., "popularity"):
class PopularitySortFactory implements SortCriteriaFactoryInterface {
public function create(array $input): SortCriteria {
return new SortCriteria('popularity', SortCriteria::DIRECTION_DESC);
}
}
Query Templates:
queryTemplateFilter for dynamic query generation:
filters: {
queryTemplate: { template: "custom_template", params: { tag: "news" } }
}
Context Dispatchers:
ContextDispatcherInterface:
class CustomContextDispatcher implements ContextDispatcherInterface {
public function dispatch(Context $context): Context { ... }
}
Static Images:
staticImage for non-dynamic assets:
teaser {
... on MediaTeaser {
staticImage { url }
}
}
Min Hit Count:
atoolo_graphql_search:
min_hit_count: 3 # Default: 0
Base Offsets:
from: "-30d" needs baseOffset).Type Aliases:
TeaserFeature for teaser-specific actions (replaced actions in v1.7.0).Server-Side Execution:
Facet Limiting:
facets: [{ type: "source", limit: 5 }]
Pagination:
limit/offset over fetching all results for large datasets.Caching:
atoolo_graphql_search:
cache: cache.app
How can I help you explore Laravel packages today?