dflydev / doctrine-orm-service-provider
Doctrine ORM 服务提供者
Requires
- php: >=5.3.3
- doctrine/orm: ~2.3
- pimple/pimple: >=2.1,<4
README
为 Pimple 应用程序提供 Doctrine ORM 实体管理器作为服务。
功能
- 利用 Silex 的核心 Doctrine 服务提供者。
- 默认实体管理器可以绑定到任何数据库连接
- 可以定义多个实体管理器
- 允许服务提供者注册自己的映射的机制
要求
- PHP 5.3+
- Pimple ~2.1
- Doctrine ~2.3
目前需要同时提供 dbs 和 dbs.event_manager 服务才能正常工作。这些服务可以由像 Silex 这样的 Doctrine 服务提供者提供。如果你可以或想伪造它,那就去做吧。 :)
安装
通过 Composer 作为 dflydev/doctrine-orm-service-provider。
使用
要开始运行,请注册 DoctrineOrmServiceProvider
并手动指定包含代理和至少一个映射的目录。
在每个示例中,将提供一个绑定到默认数据库连接的实体管理器。它将通过 orm.em 访问。
<?php // Default entity manager. $em = $app['orm.em'];
Pimple
<?php use Dflydev\Provider\DoctrineOrm\DoctrineOrmServiceProvider; use Pimple\Container; $container = new Container; $container['db.options'] = array( 'driver' => 'pdo_sqlite', 'path' => '/path/to/sqlite.db', ); // ensure that $container['dbs'] and $container['dbs.event_manager'] // are available, most likely by way of a core service provider. $container->register(new DoctrineOrmServiceProvider, array( 'orm.proxies_dir' => '/path/to/proxies', 'orm.em.options' => array( 'mappings' => array( // Using actual filesystem paths array( 'type' => 'annotation', 'namespace' => 'Foo\Entities', 'path' => __DIR__.'/src/Foo/Entities', ), array( 'type' => 'xml', 'namespace' => 'Bat\Entities', 'path' => __DIR__.'/src/Bat/Resources/mappings', ), // XML/YAML driver (Symfony2 style) // Mapping files can be named like Foo.orm.yml // instead of Baz.Entities.Foo.dcm.yml array( 'type' => 'simple_yml', 'namespace' => 'Baz\Entities', 'path' => __DIR__.'/src/Bat/Resources/config/doctrine', ), ), ), ));
Silex
此服务提供者的 2.x 版本与 Silex 的 2.x 版本兼容,此服务提供者的 1.x 版本与 Silex 的 1.x 版本兼容。以下是一个此服务提供者 2.x 版本和 Silex 2.x 版本的示例。
<?php use Dflydev\Provider\DoctrineOrm\DoctrineOrmServiceProvider; use Silex\Application; use Silex\Provider\DoctrineServiceProvider; $app = new Application; $app->register(new DoctrineServiceProvider, array( 'db.options' => array( 'driver' => 'pdo_sqlite', 'path' => '/path/to/sqlite.db', ), )); $app->register(new DoctrineOrmServiceProvider, array( 'orm.proxies_dir' => '/path/to/proxies', 'orm.em.options' => array( 'mappings' => array( // Using actual filesystem paths array( 'type' => 'annotation', 'namespace' => 'Foo\Entities', 'path' => __DIR__.'/src/Foo/Entities', ), array( 'type' => 'xml', 'namespace' => 'Bat\Entities', 'path' => __DIR__.'/src/Bat/Resources/mappings', ), ), ), ));
配置
参数
-
orm.em.options: 实体管理器选项数组。
这些选项可用
-
connection(默认:default):定义要使用哪个数据库连接的字符串。当通过 dbs 使用命名数据库时使用。
-
mappings:映射定义数组。
每个映射定义应是一个包含以下选项的数组
- type:映射驱动程序类型,可以是
annotation
、xml
、yml
、simple_xml
、simple_yml
或php
之一。 - namespace:实体所在的空间。
新增:在 v1.1 中添加了
simple_xml
和simple_yml
驱动程序类型,并提供了对 Doctrine 的 简化 XML 驱动程序 和 简化 YAML 驱动程序 的支持。此外,每个映射定义还应包含以下选项之一
- path:映射文件所在的位置路径。这应该是一个实际的文件系统路径。对于 php 驱动程序,它可以是一个路径数组
- resources_namespace:映射文件所在的位置的类似命名空间路径。例如:
Path\To\Foo\Resources\mappings
每个映射定义可以有以下可选选项
- alias(默认:null):设置实体命名空间的别名。
每个 annotation 映射也可以指定以下选项
- use_simple_annotation_reader (默认值:true):如果设置为
true
,则只有简单的注解如@Entity
会生效。如果设置为false
,则可以使用更高级的注解和通过use
关键字进行别名映射。例如:use Doctrine\ORM\Mapping AS ORM
,@ORM\Entity
。注意,如果设置为false
,则可能需要正确配置AnnotationRegistry
以便它可以加载您的注解类。请参阅此常见问题解答:[为什么找不到我的注解类?](#user-content-why-arent-my-annotations-classes-being-found)
- type:映射驱动程序类型,可以是
-
query_cache (默认值:由 orm.default_cache 指定的设置):描述查询缓存实现的字符串或数组。
-
metadata_cache (默认值:由 orm.default_cache 指定的设置):描述元数据缓存实现的字符串或数组。
-
result_cache (默认值:由 orm.default_cache 指定的设置):描述结果缓存实现的字符串或数组。
-
hydration_cache (默认值:由 orm.default_cache 指定的设置):描述数据填充缓存实现的字符串或数组。
-
types:自定义类型数组,格式为 'typeName' => 'Namespace\To\Type\Class'。
-
-
orm.ems.options:按每个实体管理器的名称索引的实体管理器配置集数组。每个值应类似于 orm.em.options。
示例配置
<?php $app['orm.ems.default'] = 'sqlite'; $app['orm.ems.options'] = array( 'mysql' => array( 'connection' => 'mysql', 'mappings' => array(), ), 'sqlite' => array( 'connection' => 'sqlite', 'mappings' => array(), ), );
示例用法
<?php $emMysql = $app['orm.ems']['mysql']; $emSqlite = $app['orm.ems']['sqlite'];
-
orm.ems.default (默认值:第一个处理的实体管理器):定义默认实体管理器名称的字符串。
-
orm.proxies_dir:定义 Doctrine 生成的代理位置的路由。
-
orm.proxies_namespace (默认值:DoctrineProxy):定义 Doctrine 生成的代理应位于其中的命名空间。
-
orm.auto_generate_proxies:定义是否应自动生成代理。
-
orm.class_metadata_factory_name:类元数据工厂的类名。类实现
Doctrine\Common\Persistence\Mapping\ClassMetadataFactory
。 -
orm.default_repository_class:默认仓库的类名。类实现
Doctrine\Common\Persistence\ObjectRepository
。 -
orm.repository_factory:仓库工厂,实例
Doctrine\ORM\Repository\RepositoryFactory
。 -
orm.entity_listener_resolver:实体监听器解析器,实例
Doctrine\ORM\Mapping\EntityListenerResolver
。 -
orm.default_cache:描述默认缓存实现的字符串或数组。
-
orm.add_mapping_driver:提供向实体管理器添加映射驱动的功能。
这些参数是可用的
- $mappingDriver:要添加的映射驱动,实例
Doctrine\Common\Persistence\Mapping\Driver\MappingDriver
。 - $namespace:由
$mappingDriver
映射的命名空间,字符串。 - $name:要添加映射到的实体管理器的名称,字符串,默认
null
。
- $mappingDriver:要添加的映射驱动,实例
-
orm.em_name_from_param:提供从参数中检索实体管理器名称的功能。
这有助于在可选的情况下允许用户指定为第三方服务提供商配置哪个实体管理器,如果没有明确指定,则回退到默认实体管理器。
例如
<?php $emName = $app['orm.em_name_from_param']('3rdparty.provider.em'); $em = $app['orm.ems'][$emName];
此代码可以在第三方服务提供商中安全使用,无论用户是否定义了
3rdparty.provider.em
。 -
orm.strategy:
- naming:命名策略,实例
Doctrine\ORM\Mapping\NamingStrategy
。 - quote:引号策略,实例
Doctrine\ORM\Mapping\QuoteStrategy
。
- naming:命名策略,实例
-
orm.custom.functions:
- string,numeric,datetime:自定义 DQL 函数,按 DQL 函数名称索引的类名数组。类是
Doctrine\ORM\Query\AST\Functions\FunctionNode
的子类。 - hydration_modes:填充器类名,按填充模式名称索引。类是
Doctrine\ORM\Internal\Hydration\AbstractHydrator
的子类。
- string,numeric,datetime:自定义 DQL 函数,按 DQL 函数名称索引的类名数组。类是
服务
- orm.em:实体管理器,实例
Doctrine\ORM\EntityManager
。 - orm.ems:实体管理器,按名称索引的
Doctrine\ORM\EntityManager
数组。
常见问题解答
为什么找不到我的注解类?
当实体中将 use_simple_annotation_reader 设置为 False
时,需要将项目的自动加载器添加到 AnnotationRegistry
中。
示例
<?php $loader = require __DIR__ . '/../vendor/autoload.php'; \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
为什么没有管理注册表的实现?
在 saxulum-doctrine-orm-manager-registry-provider 已存在第三方 ManagerRegistry
实现。它支持表单组件已知的 entity
类型,添加了 UniqueEntity
验证器和命令行集成。
许可证
MIT,见 LICENSE。
社区
如果您有问题或想帮忙,请加入我们 irc.freenode.net 上的 #dflydev 或 #silex-php 频道。
非原创
此项目在核心 Doctrine 服务提供者 和 @docteurklein 在 docteurklein/silex-doctrine-service-providers 项目上的工作基础上进行了大量开发。一些灵感也来自 Doctrine Bundle 和 Doctrine 桥接器。