The SchemaContextBundle provides a lightweight way to manage dynamic schema context across your Symfony application, especially useful for multi-tenant setups. It allows schema resolution based on request headers and propagates schema information through Symfony Messenger.
- Extracts tenant schema from request headers.
- Stores schema context in a global
SchemaResolver
. - Injects schema info into Messenger messages via a middleware.
- Rehydrates schema on message consumption via a middleware.
composer require macpaw/schema-context-bundle
If you are not using Symfony Flex, register the bundle manually:
// config/bundles.php
return [
Macpaw\SchemaContextBundle\SchemaContextBundle::class => ['all' => true],
];
Add this config to config/packages/schema_context.yaml
:
schema_context:
app_name: '%env(APP_NAME)%' # Application name
header_name: 'X-Tenant' # Request header to extract schema name
default_schema: 'public' # Default schema to fallback to
allowed_app_names: ['develop', 'staging', 'test'] # App names where schema context is allowed to change
If you're using .env, define the app name:
APP_NAME=develop
use Macpaw\SchemaContextBundle\Service\SchemaResolver;
public function index(SchemaResolver $schemaResolver)
{
$schema = $schemaResolver->getSchema();
// Use schema in logic
}
The bundle provides a middleware that automatically:
-
Adds a SchemaStamp to dispatched messages
-
Restores the schema context on message handling
Enable the middleware in your messenger.yaml
:
framework:
messenger:
buses:
messenger.bus.default:
middleware:
- Macpaw\SchemaContextBundle\Messenger\Middleware\SchemaMiddleware
To run tests:
vendor/bin/phpunit
Feel free to open issues and submit pull requests.
This bundle is released under the MIT license.