- Meta Tags
- OpenGraph (Twitter Cards, Facebook, LinkedIn, Instagram, Discord and more)
- Structured Data (Schema)
- Sitemap Generation
- Google Tag
- Meta Pixel
- SEO Profiling [Dev mode]
- Breadcrum Generation
Make sure Composer is installed globally, as explained in the installation chapter of the Composer documentation.
Open a command console, enter your project directory and execute:
composer require rami/seo-bundle
This will enable the bundle by adding it to the list of registered bundles
in the config/bundles.php
file of your project:
// config/bundles.php
return [
// ...
Abdellahramadan\SeoBundle\SeoBundle::class => ['all' => true],
];
Define Meta Tags in Two ways:
- Type hint the
MetaTagsInterface
into a controller
use Abdellahramadan\SeoBundle\Metas\MetaTagsManagerInterface;
public function myController(MetaTagsManagerInterface $metaTags): Response
{
$metaTags->setTitle('My Title')
->setDescription('This is the description of the page')
->setKeywords(['keywords', 'seo', 'meta'])
->setCanonical('https://canonical.com')
;
}
- Directly in twig
{{ meta_tags(title: 'My Title', description: 'This is the description of the page' ...)}
Make sure you add this {{ meta_tags }}
to the head your Twig file (preferably the base template)
<head>
{{ meta_tags() }}
</head>
This will render in the head the following
<head>
<title>My Title</title>
<meta name="description" content="This is the description of the page'">
<meta name="keywords" content="keywords, seo, meta">
<link rel="canonical" href="https://canonical.com">
</head>
Add {{ open_graph() }}
to the base template or any page where the meta information will be injected
In your controller, type-hint OpenGraphInterface
use Abdellahramadan\OpenGraphBundle\OpenGraph\OpenGraphManagerInterface;
class HomeController extends AbstractController
{
public function index(OpenGraphManagerInterface $openGraph): Response
{
$openGraph
->setTitle('My website')
->setDescription('Some descriptions ...')
->setSiteName('My Blog')
;
...
return $this-render('index.html.twig');
}
}
This will render
<meta property="og:title" content="My website">
<meta property="og:description" content="Some descriptions ...">
<meta property="og:site_name" content="My Blog">
You can also leave out setting the properties in the controller and set directly in Twi
{{ meta_tags(title: 'My website', siteName: 'My Blog') }}
full document at Open Graph Docs
use Rami\SeoBundle\Schema\SchemaInterface;
use Symfony\Component\HttpFoundation\Response;
...
#[Route('/', name: 'app_home')]
public function index(SchemaInterface $schema): Response
{
$person = $schema
->person()
->name('Abdel Ramadan')
->email('abdellah@hey.cm')
->children([
$schema->person()->name('Rami')->email('ramadanabdel24@gmail.com')->givenName('Ramadan'),
$schema->person()->name('Rami 3')->email('test@gmail.com')
]);
$schema->render($person);
}
enable the schema in the config:
seo:
schema:
enabled: true
This is an example using the Person
object which will render
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Person",
"name": "Abdel Ramadan",
"email": "abdellah@hey.cm",
"children": [
{
"@type": "Person",
"name": "Rami",
"email": "ramadanabdel24@gmail.com",
"givenName": "Ramadan"
},
{
"@type": "Person",
"name": "Rami 3",
"email": "test@gmail.com"
}
]
}
</script>
Full Schema docs at Schema Org Docs
This package automates the generation of sitemaps.
#[Sitemap()]
#[Route('/', name: 'app_home')]
public function index() {
...
}
#[Sitemap()]
#[Route('/blog', name: 'blog')]
public function blogIndex() {
...
}
This will add the the url entries into sitemaps/default.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://mysite.com/blog</loc>
</url>
<url>
<loc>https://mysite.com/</loc>
</url>
</urlset>
Full Sitemap docs Sitemap Docs
Full documentation at Documentation