Configuration
Register a Custom DQL Function
return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'numeric_functions' => [ 'ROUND' => \My\DoctrineExtensions\Query\Mysql\Round::class, ], ], ], ],];
How to add a Custom Type
First, implement a new type by extending Doctrine\DBAL\Types\Type. An example can be found in
the ORM cookbook
Then, register your type implementation with DBAL as follows:
return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'types' => [ 'newtype' => \My\Types\NewType::class, ], ], ], ],];
|
If your type uses a database type which is already mapped by Doctrine,
Doctrine will need a comment hint to distinguish your type from other types. In your type class, override
|
Next, you will need to register your custom type with the underlying database platform:
return [ 'doctrine' => [ 'connection' => [ 'orm_default' => [ 'doctrine_type_mappings' => [ 'mytype' => 'mytype', ], ], ], ],];
Using DBAL Middlewares
|
This feature is only available when using DBAL 3.x and has no effect on DBAL 2.x! |
Laminas configuration
return [ 'service_manager' => [ 'invokables' => [ \My\Middlewares\CustomMiddleware::class => \My\Middlewares\CustomMiddleware::class, \My\Middlewares\AnotherCustomMiddleware::class => \My\Middlewares\AnotherCustomMiddleware::class, ], ], 'doctrine' => [ 'configuration' => [ 'test_default' => [ 'middlewares' => [ \My\Middlewares\CustomMiddleware::class, \My\Middlewares\AnotherCustomMiddleware::class, ], ], ], ],];
Built-in Resolver
How to Define Relationships with Abstract Classes and Interfaces (ResolveTargetEntityListener)
return [ 'doctrine' => [ 'entity_resolver' => [ 'orm_default' => [ 'resolvers' => [ \Acme\InvoiceModule\Model\InvoiceSubjectInterface::class, \Acme\CustomerModule\Entity\Customer::class, ], ], ], ],];
Set a Custom Default Repository
return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'default_repository_class_name' => 'MyCustomRepository', ], ], ],];
How to Use Two Connections
In this example we create an 'orm_crawler' ORM connection. See also this blog article.
return [ 'doctrine' => [ 'connection' => [ 'orm_crawler' => [ 'driverClass' => \Doctrine\DBAL\Driver\PDO\MySQL\Driver::class, 'eventmanager' => 'orm_crawler', 'configuration' => 'orm_crawler', 'params' => [ 'host' => 'localhost', 'port' => '3306', 'user' => 'root', 'password' => 'root', 'dbname' => 'crawler', 'driverOptions' => [ 1002 => 'SET NAMES utf8', ], ], ], ], 'configuration' => [ 'orm_crawler' => [ 'metadata_cache' => 'array', 'query_cache' => 'array', 'result_cache' => 'array', 'hydration_cache' => 'array', 'driver' => 'orm_crawler_chain', 'generate_proxies' => true, 'proxy_dir' => 'data/DoctrineORMModule/Proxy', 'proxy_namespace' => 'DoctrineORMModule\Proxy', 'filters' => [], ], ], 'driver' => [ 'orm_crawler_annotation' => [ 'class' => \Doctrine\ORM\Mapping\Driver\AnnotationDriver::class, 'cache' => 'array', 'paths' => [ __DIR__ . '/../src/Crawler/Entity', ], ], 'orm_crawler_chain' => [ 'class' => \Doctrine\ORM\Mapping\Driver\DriverChain::class, 'drivers' => [ 'Crawler\Entity' => 'orm_crawler_annotation', ], ], ], 'entitymanager' => [ 'orm_crawler' => [ 'connection' => 'orm_crawler', 'configuration' => 'orm_crawler', ], ], 'eventmanager' => [ 'orm_crawler' => [], ], 'sql_logger_collector' => [ 'orm_crawler' => [], ], 'entity_resolver' => [ 'orm_crawler' => [], ], ],];
The DoctrineModule\ServiceFactory\AbstractDoctrineServiceFactory will create the following objects as needed:
- doctrine.connection.orm_crawler
- doctrine.configuration.orm_crawler
- doctrine.entitymanager.orm_crawler
- doctrine.driver.orm_crawler
- doctrine.eventmanager.orm_crawler
- doctrine.entity_resolver.orm_crawler
- doctrine.sql_logger_collector.orm_crawler
You can retrieve them from the service manager via their keys.
How to Use a Naming Strategy
Laminas Configuration
return [ 'service_manager' => [ 'invokables' => [ \Doctrine\ORM\Mapping\UnderscoreNamingStrategy::class => \Doctrine\ORM\Mapping\UnderscoreNamingStrategy::class, ], ], 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'naming_strategy' => \Doctrine\ORM\Mapping\UnderscoreNamingStrategy::class, ], ], ],];
How to Use a Quote Strategy
Laminas Configuration
return [ 'service_manager' => [ 'invokables' => [ \Doctrine\ORM\Mapping\AnsiQuoteStrategy::class => \Doctrine\ORM\Mapping\AnsiQuoteStrategy::class, ], ], 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'quote_strategy' => \Doctrine\ORM\Mapping\AnsiQuoteStrategy::class, ], ], ],];
How to Override RunSqlCommand Creation
The following Laminas configuration can be used to override the creation of the
Doctrine\DBAL\Tools\Console\Command\RunSqlCommand instance used by this
module.
return [ 'service_manager' => [ 'factories' => [ 'doctrine.dbal_cmd.runsql' => MyCustomRunSqlCommandFactory::class, ], ],];
How to Exclude Tables from a Schema Diff
The "schema_assets_filter" option can be used to exclude certain tables from being deleted in a schema update.
It should be set with a filter callback that will receive the table name and should return false for any tables that must be excluded and true for any other tables.
return [ 'doctrine' => [ 'configuration' => [ 'orm_default' => [ 'schema_assets_filter' => fn (string $tableName): bool => ( ! in_array($tableName, ['doNotRemoveThisTable', 'alsoDoNotRemoveThisTable']) ), ], ], ],];
|
If you want your application config to be cached, you should use a callable in terms of a static
function (like |
