juliangut/doctrine-manager-builder
Composer 安装命令:
composer require juliangut/doctrine-manager-builder
包简介
Doctrine2 managers builder
README 文档
README
Doctrine2 managers builder
Frees you from the tedious work of configuring Doctrine's managers, ORM Entity Manager, MongoDB Document Manager and CouchDB Document Manager.
Installation
Composer
composer require juliangut/doctrine-manager-builder
If using MongoDB on PHP >= 7.0
composer require alcaeus/mongo-php-adapter --ignore-platform-reqs
Usage
Relational Database Entity Manager
use Jgut\Doctrine\ManagerBuilder\ManagerBuilder; use Jgut\Doctrine\ManagerBuilder\RelationalBuilder; $rdbmsBuilder = new RelationalBuilder([ 'annotation_autoloaders' => ['class_exists'], 'connection' => [ 'driver' => 'pdo_sqlite', 'memory' => true, ], 'metadata_mapping' => [ [ 'type' => ManagerBuilder::METADATA_MAPPING_ANNOTATION, 'path' => 'path/to/entities', ], ], ]);
MongoDB Document Manager
use Jgut\Doctrine\ManagerBuilder\ManagerBuilder; use Jgut\Doctrine\ManagerBuilder\MongoDBBuilder; $mongoDBBuilder = new MongoDBBuilder([ 'annotation_autoloaders' => ['class_exists'], 'connection' => [ 'server' => 'mongodb://localhost:27017', 'options' => ['connect' => false], ], 'metadata_mapping' => [ [ 'driver' => new \Doctrine\ORM\Mapping\Driver\YamlDriver( 'path/to/document/yaml/mapping/files', '.yml' ), ], [ 'type' => ManagerBuilder::METADATA_MAPPING_PHP, 'path' => 'path/to/document/php/mapping/files', 'namespace' => 'Project\Document\Namespace', ], ], ]); $documentManager = $mongoDBBuilder->getManager();
CouchDB Document Manager
use Jgut\Doctrine\ManagerBuilder\CouchDBBuilder; use Jgut\Doctrine\ManagerBuilder\MongoDBBuilder; $couchDBBuilder = new CouchDBBuilder([ 'annotation_autoloaders' => ['class_exists'], 'connection' => [ 'host' => 'localhost', 'dbname' => 'doctrine', ], 'metadata_mapping' => [ [ 'type' => ManagerBuilder::METADATA_MAPPING_XML, 'path' => 'path/to/document/xml/mapping/files', 'extension' => '.xml', ], ], ]); $documentManager = $couchDBBuilder->getManager();
Mind that Doctrine CouchDB ODM support is not as good/wide as in Doctrine ORM or Doctrine MongoDB ODM
Configuration
Common
metadata_mappingREQUIRED array of metadata mapping drivers or configurations to create them, see note belowannotation_filesarray of Doctrine annotations filesannotation_namespacesarray of Doctrine annotations namespacesannotation_autoloadersarray of Doctrine annotations auto-loader callableproxies_pathpath were Doctrine creates its proxy classes, defaults to /tmpproxies_namespacestring for proxies namespaceproxies_auto_generationinteger indicating proxy auto generation behaviormetadata_cache_driver\Doctrine\Common\Cache\CacheProvider metadata cache drivermetadata_cache_namespacestring for metadata cache namespace (different for each type of manager)event_managera configuredDoctrine\Common\EventManagerevent_subscribersan array of customDoctrine\Common\EventSubscriber
Relational ORM Entity Manager
connectionREQUIRED array of PDO configurations or a \Doctrine\DBAL\Connection. See supported driversquery_cache_driver\Doctrine\Common\Cache\CacheProvider query cache driver, defaults tometadata_cache_driverquery_cache_namespacestring for query cache namespace, defaults to 'DoctrineRDBMSORMQueryCache'result_cache_driver\Doctrine\Common\Cache\CacheProvider result cache driver, defaults tometadata_cache_driverresult_cache_namespacestring for result cache namespace, defaults to 'DoctrineRDBMSORMResultCache'hydrator_cache_driver\Doctrine\Common\Cache\CacheProvider hydrator cache driver, defaults tometadata_cache_driverhydrator_cache_namespacestring for hydrator cache namespace, defaults to 'DoctrineRDBMSORMHydratorCache'repository_factory\Doctrine\ORM\Repository\RepositoryFactorydefault_repository_class\Doctrine\ORM\EntityRepositorynaming_strategya\Doctrine\ORM\Mapping\NamingStrategy, defaults toUnderscoreNamingStrategyquote_strategya\Doctrine\ORM\Mapping\QuoteStrategy, defaults toDefaultQuoteStrategysecond_level_cache_configurationa\Doctrine\ORM\Cache\CacheConfigurationsql_loggera\Doctrine\DBAL\Logging\SQLLoggercustom_typesarray of'type_name' => '\Doctrine\DBAL\Types\Type'custom_mapping_typesarray of'type_name' => 'Doctrine type: a constant on \Doctrine\DBAL\Types\Type'. Used in conjunction with custom_typescustom_filtersarray of custom'filter_name' => '\Doctrine\ORM\Query\Filter\SQLFilter'string_functionsarray of custom'function_name' => '\Doctrine\ORM\Query\AST\Functions\FunctionNode'for string DQL functionsnumeric_functionsarray of custom'function_name' => '\Doctrine\ORM\Query\AST\Functions\FunctionNode'for numeric DQL functionsdatetime_functionsarray of custom'function_name' => '\Doctrine\ORM\Query\AST\Functions\FunctionNode'for datetime DQL functions
MongoDB ODM Document Manager
connectionREQUIRED array of \MongoClient configurations (server and options) or a \Doctrine\MongoDB\Connectiondefault_databaseREQUIRED default database to be used in case none specifiedhydrators_pathpath where Doctrine creates its hydrator classes, defaults to /tmphydrators_namespacestring for hydrators namespace, defaults to 'DoctrineMongoDBODMHydrator'hydrators_auto_generationinteger indicating hydrators auto generation behaviorpersistent_collections_pathpath where Doctrine creates its persistent collection classes, defaults to /tmppersistent_collections_namespacestring for persistent collections namespace, defaults to 'DoctrineMongoDBODMPersistentCollection'persistent_collections_auto_generationinteger persistent collections auto generation behaviorrepository_factory\Doctrine\ODM\MongoDB\Repository\RepositoryFactorydefault_repository_class\Doctrine\ODM\MongoDB\DocumentRepositorylogger_callablevalid callablecustom_typesarray of'type_name' => '\Doctrine\ODM\MongoDB\Types\Type'custom_filtersarray of custom'filter_name' => '\Doctrine\ODM\MongoDB\Query\Filter\BsonFilter'
CouchDB ODM Document Manager
connectionREQUIRED array of \Doctrine\CouchDB\CouchDBClient configurations or a \Doctrine\CouchDB\CouchDBClientrepository_factory\Jgut\Doctrine\ManagerBuilder\CouchDB\Repository\RepositoryFactorydefault_repository_class\Doctrine\ODM\CouchDB\DocumentRepositorylucene_handler_nameApache Lucene handler name
Considerations
- Make sure you always provide an
annotation_autoloadercallable to fallback in loading annotations, typically it will be 'class_exists'. If creating various managers this should be added to the last one generated. metadata_mappingmust be an array containing arrays of configurations to create MappingDriver objects:typeone of \Jgut\Doctrine\ManagerBuilder\ManagerBuilder constants:METADATA_MAPPING_ANNOTATION,METADATA_MAPPING_XML,METADATA_MAPPING_YAMLorMETADATA_MAPPING_PHPREQUIRED if no driverpatha string path or array of paths to where mapping files are REQUIRED if no driverextensionoverrides default mapping file extension: '.dcm.xml' for XML files and '.dcm.yml' for YAML filesnamespacethe namespace under which the mapped classes are REQUIRED only if more than ONE mapping driver is defineddriveran already created \Doctrine\Common\Persistence\Mapping\Driver\MappingDriver object REQUIRED if no type AND path
metadata_cache_driver, if not provided, is automatically generated in the following order based on availability:ApcuCache,XcacheCache,MemcacheCache,RedisCacheand finally fallback toArrayCachewhich is always available. Any other cache driver not provided will fallback to using a clone of metadata cache driver.proxies_auto_generation,hydrators_auto_generationandpersistent_collections_auto_generationconfiguration values are Doctrine\Common\Proxy\AbstractProxyFactory constants, in all cases it defaults toAUTOGENERATE_NEVER.
Managers are being configured ready for production, this means proxies, hydrators and persisten collections won't be automatically generated and, in case no cache driver is provided, one will be auto-generated. It is recommended you always provide your cache provider. For development you should use VoidCache.
Extending managers
Extending default managers with extra features is extremely easy. Lets see two examples with well-known libraries.
Adding new types
Using ramsey/uuid-doctrine
composer require ramsey/uuid-doctrine
use Jgut\Doctrine\ManagerBuilder\RelationalBuilder; use Ramsey\Uuid\Doctrine\UuidType; require __DIR__ . '/vendor/autoload.php'; $rdbmsBuilder = new RelationalBuilder([ 'annotation_autoloaders' => ['class_exists'], 'connection' => [ 'driver' => 'pdo_sqlite', 'memory' => true, ], 'metadata_mapping' => [ [ 'type' => ManagerBuilder::METADATA_MAPPING_ANNOTATION, 'path' => 'path/to/entities', ], ], // Register UUID as custom type 'custom_types' => ['uuid' => UuidType::class], ]); $entityManager = $rdbmsBuilder->getManager();
Adding new behaviour
Using gedmo/doctrine-extensions
composer require gedmo/doctrine-extensions
use Gedmo\DoctrineExtensions; use Gedmo\Sluggable\SluggableListener; use Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter; use Gedmo\SoftDeleteable\SoftDeleteableListener; use Gedmo\Timestampable\TimestampableListener; use Jgut\Doctrine\ManagerBuilder\RelationalBuilder; require __DIR__ . '/vendor/autoload.php'; $rdbmsBuilder = new RelationalBuilder([ 'annotation_autoloaders' => ['class_exists'], 'connection' => [ 'driver' => 'pdo_sqlite', 'memory' => true, ], 'metadata_mapping' => [ [ 'type' => ManagerBuilder::METADATA_MAPPING_ANNOTATION, 'path' => 'path/to/entities', ], ], // Register new doctrine behaviours 'event_subscribers' => [ new SluggableListener, new TimestampableListener, new SoftDeleteableListener, ], // Register custom filters 'custom_filters' => [ 'soft-deleteable' => SoftDeleteableFilter::class, ], ]); // Register mapping driver into DoctrineExtensions DoctrineExtensions::registerAbstractMappingIntoDriverChainORM($rdbmsBuilder->getMetadataMappingDriver()); // Get entity manager as usual $entityManager = $rdbmsBuilder->getManager();
Console integration
Although Doctrine ORM comes with a great CLI tool this library is intended to be used without ORM, and thus a new tool has been created instead of forcing to require Doctrine ORM.
This new CLI tool (doctrine-manager) is more powerful in the sense that it runs the same commands for different databases (managers) of the same kind by providing \Jgut\Doctrine\ManagerBuilder\ConsoleBuilder with named builders.
The configuration of doctrine-manager tool resembles the one ORM comes with and so you must have a 'cli-config.php' or ' config/cli-config.php' file
The only difference is that here you must return an instance of Symfony\Component\Console\Application instead of a Symfony\Component\Console\Helper\HelperSet
use Jgut\Doctrine\ManagerBuilder\ConsoleBuilder; use Jgut\Doctrine\ManagerBuilder\RelationalBuilder; require __DIR__ . '/vendor/autoload.php'; $settings = require 'managers-configurations.php'; $consoleBuilder = new ConsoleBuilder; $consoleBuilder->addBuilder(new RelationalBuilder($settings['main'], 'one')); $consoleBuilder->addBuilder(new RelationalBuilder($settings['secondary'], 'two')); return $consoleBuilder->getApplication();
If you run ./vendor/bin/doctrine-manager list you will find the commands prefixed with builder's name, so commands are run with different managers
Available commands:
...
dbal
dbal:one:import Import SQL file(s) directly to Database.
dbal:one:run-sql Executes arbitrary SQL directly from the command line.
dbal:two:import Import SQL file(s) directly to Database.
dbal:two:run-sql Executes arbitrary SQL directly from the command line.
...
orm
orm:one:clear-cache:metadata Clear all metadata cache of the various cache drivers.
orm:one:clear-cache:query Clear all query cache of the various cache drivers.
orm:two:clear-cache:metadata Clear all metadata cache of the various cache drivers.
orm:two:clear-cache:query Clear all query cache of the various cache drivers.
...
doctrine-manager only allows named manager builders
Contributing
Found a bug or have a feature request? Please open a new issue. Have a look at existing issues before.
See file CONTRIBUTING.md
License
See file LICENSE included with the source code for a copy of the license terms.
统计信息
- 总下载量: 2.07k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: BSD-3-Clause
- 更新时间: 2016-09-11