Skip to content
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time

Usage with SEO Bundle


If the SEO Bundle has been installed, the Schema Bundle will implement a MetaData Middleware by default. This allows you to create schema blocks within the SEO Workflow.

I. Simple Usage Example

        - { name: seo.meta_data.extractor, identifier: my_schema_data_extractor }



namespace App\MetaData\Extractor;

use SeoBundle\MetaData\Extractor\ExtractorInterface;
use SeoBundle\Model\SeoMetaDataInterface;
use Spatie\SchemaOrg\Graph;
use Spatie\SchemaOrg\Organization;

class SchemaDataExtractor implements ExtractorInterface
    public function supports($element): bool
        return $element instanceof MyClass;

    public function updateMetaData($element, ?string $locale, SeoMetaDataInterface $seoMetadata): void
        $graphMiddleware = $seoMetadata->getMiddleware('schema_graph');

        $graphMiddleware->addTask(function (SeoMetaDataInterface $seoMetadata, Graph $graph) {
            /** @var Organization $organisation */
            $organisation = $graph->getOrCreate(Organization::class);
            $organisation->name('My Organisation');
            $organisation->description('My Organisation Description');

Adding Schema Data

As you can see, you don't need to add any data to the SeoMetaData Object. This task will be dispatched by the middleware class itself. After all extractors have been dispatched, a schema block will be added to your meta block.

This allows you to add multiple schema information within multiple extractors but only one schema block will be generated!

II. Twig Usage

Render json-ld data directly in twig templates

You're able to render json-ld data in your markup. For this you need to make use of the json_ld_fragment twig extension.

Register Service

    autowire: true
        - { name: schema.fragment_generator, alias: product }

Build Service


namespace App\Schema\Generator;

use Pimcore\Model\DataObject\MyClass;
use SchemaBundle\Generator\FragmentGeneratorInterface;
use Spatie\SchemaOrg\BaseType;
use Spatie\SchemaOrg\Schema;

class ProductFragmentGenerator implements FragmentGeneratorInterface
    public function supportsElement($element): bool
        return $element instanceof MyClass;

    public function generateForElement($element): ?BaseType
        /** @var MyClass $product */
        $product = $element;

        return Schema::product()

Add Filter to Object

<div class="container">
    <h3>json ld fragment for object</h3>
    {% set object = pimcore_object(41) %}
    {{ object|json_ld_fragment }}


Create a simple symfony service if you need to do things twice!