PHPackages                             lensmedia/symfony-seo - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. lensmedia/symfony-seo

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

lensmedia/symfony-seo
=====================

"Private" bundle for some reusable seo stuff.

22641PHP

Since Dec 18Pushed 4mo ago1 watchersCompare

[ Source](https://github.com/lensmedia/symfony-seo)[ Packagist](https://packagist.org/packages/lensmedia/symfony-seo)[ RSS](/packages/lensmedia-symfony-seo/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

LensSeoBundle
=============

[](#lensseobundle)

Some simple reusable SEO tools for Symfony projects.

Meta
----

[](#meta)

### Attribute

[](#attribute)

```
use Lens\Bundle\SeoBundle\Attribute\Meta;

class Index extends AbstractController
{
    #[Route([
        'nl' => null,
        'en' => '/en',
    ], name: 'homepage')]
    #[Meta('nl', 'Hoi wereld!', keywords: ['lens', 'zmo', 'bundel'])]
    #[Meta('en', 'Hello world!', keywords: ['lens', 'seo', 'bundle'])]
    public function __invoke(): Response
    {
        return $this->render('homepage.html.twig');
    }
}
```

### Using in twig

[](#using-in-twig)

The `Twig/MetaExtension` adds a global variable `lens_seo_meta` (can be changed, see config) to the twig context that can then be used

```
{{ title ?? lens_seo_meta.title ?? 'meta.title'|trans }}

{% set title = lens_seo_meta.title ?? title ?? 'meta.title'|trans %}
{% set description = lens_seo_meta.description ?? description ?? 'meta.description'|trans %}

{% if lens_seo_meta is defined and lens_seo_meta is not empty %}

    {% if (keywords ?? lens_seo_meta.keywords)|length %}

    {% endif %}
{% endif %}
```

### Meta resolver

[](#meta-resolver)

A meta resolver allows for full control over the meta tags, mainly useful for dynamic routes.

```
#[Route(name: 'faq')]
#[Meta(resolver: FaqResolver::class)]
public function __invoke(): Response
{
   ...
```

```
namespace App\Seo\Meta;

use Lens\Bundle\SeoBundle\Attribute\Meta;
use Lens\Bundle\SeoBundle\MetaResolverInterface;
use Symfony\Component\HttpFoundation\Request;

class FaqResolver implements MetaResolverInterface
{
    public function resolveMeta(Request $request, Meta $meta): void
    {
        // This works well if you have an entity value resolver, otherwise you
        // can use the value and use dependency injection to get the entity.
        $faq = $request->attributes->get('faq');

        $meta->title = $faq->metaTitle ?? $faq->question;
        $meta->description = $faq->metaDescription;
    }
```

Breadcrumbs
-----------

[](#breadcrumbs)

### Attribute to add breadcrumbs

[](#attribute-to-add-breadcrumbs)

```
use Lens\Bundle\SeoBundle\Attribute\Breadcrumb;

class Index extends AbstractController
{
    #[Route(name: 'homepage_route_name')]
    #[Breadcrumb([
        'nl' => 'homepagina',
        'en' => 'homepage',
    ])]
    public function __invoke(): Response
    {
        return $this->render('homepage.html.twig');
    }
}
```

```
class Faq extends AbstractController
{
    #[Route(name: 'faq_route_name')]
    #[Breadcrumb([
        'nl' => 'veel gestelde vragen',
        'en' => 'frequently asked questions',
    ], parent: 'homepage_route_name')]
    public function __invoke(): Response
    {
        return $this->render('faq.html.twig');
    }
}
```

### Using in twig

[](#using-in-twig-1)

The `Twig/BreadcrumbExtension` adds a global variable `lens_seo_breadcrumbs` (can be changed, see config) to the twig context that can then be used

```
{% if lens_seo_breadcrumbs is defined and lens_seo_breadcrumbs is not empty %}

        {% for breadcrumb in lens_seo_breadcrumbs %}
            {% if loop.last %}
                {{ breadcrumb.title }}
            {% else %}

                    {{ breadcrumb.title }}

            {% endif %}
        {% endfor %}

{% endif %}
```

### Breadcrumb resolver

[](#breadcrumb-resolver)

A breadcrumb resolver allows for full control over the breadcrumbs when they have dynamic values.

```
#[Route(name: 'faq')]
#[Meta(resolver: FaqResolver::class)]
public function __invoke(): Response
{
   ...
```

```
namespace App\Seo\Meta;

use Lens\Bundle\SeoBundle\Attribute\Breadcrumb;
use Lens\Bundle\SeoBundle\BreadcrumbResolverInterface;
use Symfony\Component\HttpFoundation\Request;

class FaqResolver implements BreadcrumbResolverInterface
{
    public function resolveMeta(Request $request, Breadcrumb $breadcrumb): void
    {
        $faq = $request->attributes->get('faq');

        $breadcrumb->title = $faq->question ?? $request->attributes->get('uri');
        $breadcrumb->routeParameters['uri'] = $request->attributes->get('uri');
        $breadcrumb->routeParameters['_locale'] = $request->getLocale();
    }
```

Structured Data
---------------

[](#structured-data)

Provides classes to help with setting up structured data using [spatie/schema-org](https://github.com/spatie/schema-org).

```
