mi-la01 / doctrine-orm-service-provider
Doctrine ORM 服务提供者
Requires
- php: >=5.3.3
- doctrine/orm: ~2.3
- pimple/pimple: >=2.1,<4
README
为 Pimple 应用程序提供 Doctrine ORM 实体管理器作为服务。
特性
- 利用核心 Doctrine 服务提供者,适用于 Silex。
- 默认实体管理器可以绑定到任何数据库连接
- 可以定义多个实体管理器
- 允许服务提供者注册自己的映射机制
需求
- 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 Service Provider和@docteurklein在docteurklein/silex-doctrine-service-providers项目上的工作中有很大借鉴。同时,也受到了Doctrine Bundle和Doctrine Bridge的启发。