如何为几个原则实现提供模型类
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何为几个原则实现提供模型类
当构建一个不仅可以用于Doctrine ORM,还可以用于CouchDB ODM、MongoDB ODM或PHPCR ODM的包时,您仍然应该只编写一个模型类。Doctrine包提供了一个编译器通道来为您的模型类注册映射。
请注意
对于不可重用的包,最简单的选择是把你的模型类放在默认位置:实体
教义ORM或文档
其中一个odm。对于可重用的包,使用编译器传递,而不是仅仅为了获得自动映射而复制模型类。
在您的bundle类中,编写以下代码来注册编译器通道。这一个是为CmfRoutingBundle写的,所以它的部分将需要适应你的情况:
12 34 56 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
使用学说\包\DoctrineBundle\DependencyInjection\编译器\DoctrineOrmMappingsPass;使用学说\包\MongoDBBundle\DependencyInjection\编译器\DoctrineMongoDBMappingsPass;使用学说\包\CouchDBBundle\DependencyInjection\编译器\DoctrineCouchDBMappingsPass;使用学说\包\PHPCRBundle\DependencyInjection\编译器\DoctrinePhpcrMappingsPass;使用ob娱乐下载\Cmf\RoutingBundle\模型;类CmfRoutingBundle扩展包{公共函数构建(ContainerBuilder$容器){父::构建($容器);/ /……$modelDir= realpath (__DIR__.“/资源/ config /理论/模型”);$映射=数组($modelDir= >模型::类);如果(class_exists (DoctrineOrmMappingsPass::类)){$容器->addCompilerPass (DoctrineOrmMappingsPass::createXmlMappingDriver ($映射,数组(“cmf_routing.model_manager_name”),“cmf_routing.backend_type_orm”,数组(“CmfRoutingBundle”= >模型::类)));}如果(class_exists (DoctrieMongoDBMappingsPass::类)){$容器->addCompilerPass (DoctrineMongoDBMappingsPass::createXmlMappingDriver ($映射,数组(“cmf_routing.model_manager_name”),“cmf_routing.backend_type_mongodb”,数组(“CmfRoutingBundle”= >模型::类)));}如果(class_exists (DoctrineCouchDBMappingsPass::类)){$容器->addCompilerPass (DoctrineCouchDBMappingsPass::createXmlMappingDriver ($映射,数组(“cmf_routing.model_manager_name”),“cmf_routing.backend_type_couchdb”,数组(“CmfRoutingBundle”= >模型::类)));}如果(class_exists (DoctrinePhpcrMappingsPass::类)){$容器->addCompilerPass (DoctrinePhpcrMappingsPass::createXmlMappingDriver ($映射,数组(“cmf_routing.model_manager_name”),“cmf_routing.backend_type_phpcr”,数组(“CmfRoutingBundle”= >模型::类)));}}}
注意class_exists ()检查。这是至关重要的,因为您不希望您的包对所有Doctrine包都有硬依赖,而是让用户决定使用哪个包。
编译器通道为Doctrine提供的所有驱动程序提供了工厂方法:注解、XML、Yaml、PHP和StaticPHP。论点如下:
- 绝对目录路径到命名空间的映射/哈希;
- 一个容器参数数组,您的包使用它来指定它正在使用的Doctrine管理器的名称。在上面的例子中,CmfRoutingBundle存储了在
cmf_routing.model_manager_name
参数。编译器传递将附加Doctrine用于指定默认管理器名称的参数。使用找到的第一个参数,并将映射注册到该管理器; - 一个可选的容器参数名,编译器传递将使用它来确定是否使用了此Doctrine类型。这是相关的,如果你的用户安装了多种类型的Doctrine包,但你的包只与一种类型的Doctrine一起使用;
- 别名到命名空间的映射/散列。这应该与Doctrine自动映射使用的约定相同。在上面的例子中,这允许用户调用
om - > getRepository (CmfRoutingBundle:路线)
.
请注意
工厂方法使用ob娱乐下载SymfonyFileLocator
的Doctrine,这意味着它只会看到XML和YML映射文件,如果它们不包含完整的名称空间作为文件名。这是设计好的:ob娱乐下载SymfonyFileLocator
通过假设文件只是类的“短”版本作为它们的文件名来简化事情(例如。BlogPost.orm.xml
)
类注册一个编译器传递,如果还需要映射基类DefaultFileLocator
像这样。此代码取自DoctrineOrmMappingsPass
并适应使用DefaultFileLocator
而不是ob娱乐下载SymfonyFileLocator
:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
使用学说\常见的\持久性\映射\司机\DefaultFileLocator;使用学说\ORM\映射\司机\XmlDriver;使用AppBundle\模型;/ /……私人函数buildMappingCompilerPass(){$定位器=新定义(DefaultFileLocator::类,数组(数组(realpath (__DIR__.' /资源/ config / doctrine-base ')),“.orm.xml”));$司机=新定义(XmlDriver::类,数组($定位器));返回新DoctrineOrmMappingsPass ($司机,数组(模型::类),数组(“your_bundle.manager_name”),“your_bundle.orm_enabled”);}
注意,您不需要提供名称空间别名,除非您的用户希望Doctrine提供基类。
现在将映射文件放入/ /配置/ doctrine-base资源
使用完全限定的类名,由.
而不是\
例如,Other.Namespace.Model.Name.orm.xml
.你不能把这两种混合在一起ob娱乐下载SymfonyFileLocator
会感到困惑。
针对其他原则实现进行相应调整。