Installation:
src/Awaresoft directory.vendor (if not using the utils/prepare_vendors script).composer.json references the local path (e.g., "awaresoft/sonata-seo-bundle": "dev-main").composer update and clear the cache:
php bin/console cache:clear
Enable the Bundle:
Add to config/bundles.php:
return [
// ...
Awaresoft\SonataSeoBundle\SonataSeoBundle::class => ['all' => true],
];
First Use Case:
app/config/routing.yml):
sonata_seo:
resource: "@SonataSeoBundle/Resources/config/routing.yml"
prefix: /
{% seo_meta title="My Page Title" description="SEO description" %}
Dynamic Metadata:
sonata_seo_meta) to inject metadata dynamically:
{% seo_meta title=page.title description=page.meta_description %}
# app/config/sonata_seo.yml
sonata_seo:
routes:
app_homepage:
title: "Home | My Site"
description: "Welcome to our site!"
OpenGraph/Facebook Integration:
SonataSeoService to add OpenGraph tags:
// src/Service/CustomSeoService.php
public function addOpenGraphTags(array $tags)
{
$this->getMetadataBag()->addTags($tags);
}
{% seo_meta og:title=page.title og:image=page.imageUrl %}
Caching Strategies:
MetadataBag service for performance:
$metadata = $this->get('sonata.seo.metadata_bag');
$metadata->set('route_name', ['title' => 'Cached Title']);
Event-Driven SEO:
sonata.seo.metadata.build events to modify metadata:
// src/EventListener/SeoListener.php
public function onBuildMetadata(SeoEvent $event)
{
$event->getMetadata()->setTitle('Modified Title');
}
services.yml:
services:
App\EventListener\SeoListener:
tags:
- { name: kernel.event_listener, event: sonata.seo.metadata.build, method: onBuildMetadata }
Symfony 2.x Dependency:
Metadata Overrides:
php bin/console debug:container sonata.seo.metadata_bag
Caching Issues:
php bin/console cache:clear --env=prod
metadata_bag.clear() in a custom command if needed.Twig Extension Conflicts:
sonata_seo_meta fails, check for duplicate Twig extensions. Rename or remove conflicting ones.public function onBuildMetadata(SeoEvent $event)
{
\Log::debug('SEO Metadata:', $event->getMetadata()->all());
}
<meta> tags. Missing tags often stem from:
{% seo_meta ... %} vs. {{ seo_meta(...)).metadata_bag not autowired).Custom Metadata Providers:
Extend SonataSeoBundle\Provider\MetadataProviderInterface to fetch metadata from APIs or databases:
class ApiMetadataProvider implements MetadataProviderInterface
{
public function getMetadata(string $route): array
{
return json_decode(file_get_contents("https://api.example.com/seo/$route"), true);
}
}
Register in services.yml:
services:
App\Provider\ApiMetadataProvider:
tags:
- { name: sonata.seo.metadata_provider }
Modify MetadataBag:
Override the default MetadataBag to add custom logic:
// src/SonataSeo/CustomMetadataBag.php
class CustomMetadataBag extends MetadataBag
{
public function addCustomTag(string $name, string $content)
{
$this->tags[$name] = $content;
}
}
Bind in services.yml:
services:
sonata.seo.metadata_bag:
class: App\SonataSeo\CustomMetadataBag
public: true
Route-Specific Logic:
Use the sonata.seo.route_listener event to inject route-specific data:
public function onRoute(SeoRouteEvent $event)
{
$event->setMetadata(['canonical' => route('canonical', ['id' => $event->getRoute()->getDefault('_id')])]);
}
How can I help you explore Laravel packages today?