如何为几个原则实现提供模型类
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何为几个原则实现提供模型类
当构建一个不仅可以用于Doctrine ORM,还可以用于CouchDB ODM、MongoDB ODM或PHPCR ODM的包时,您仍然应该只编写一个模型类。Doctrine包提供了一个编译器通道来为您的模型类注册映射。
请注意
对于不可重用的包,最简单的选择是把你的模型类放在默认位置:实体
教义ORM或文档
其中一个odm。对于可重用的包,使用编译器传递,而不是仅仅为了获得自动映射而复制模型类。
2.3
基本映射编译器通道是在Symfony 2.3中引入的。ob娱乐下载Doctrine bundle从DoctrineBundle >= 1.3.0, MongoDBBundle >= 3.0.0, PHPCRBundle >= 1.0.0-alpha2和(未版本化)CouchDBBundle支持编译器传递,因为CouchDB Mapping Compiler Pass pull request被合并。
如果您希望您的包支持旧版本的Symfony和Doctrine,您可以在您的包中提供编译器传递的副本。ob娱乐下载例如,请看FOSUserBundle映射配置addRegisterMappingsPass
.
在您的bundle类中,编写以下代码来注册编译器通道。这是为FOSUserBundle编写的,所以它的部分内容将需要适应您的情况:
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
使用学说\包\DoctrineBundle\DependencyInjection\编译器\DoctrineOrmMappingsPass;使用学说\包\MongoDBBundle\DependencyInjection\编译器\DoctrineMongoDBMappingsPass;使用学说\包\CouchDBBundle\DependencyInjection\编译器\DoctrineCouchDBMappingsPass;使用学说\包\PHPCRBundle\DependencyInjection\编译器\DoctrinePhpcrMappingsPass;类FOSUserBundle扩展包{公共函数构建(ContainerBuilder$容器){父::构建($容器);/ /……$modelDir= realpath (__DIR__.“/资源/ config /理论/模型”);$映射=数组($modelDir= >“”丛书\ UserBundle \模式”,);$ormCompilerClass=的学说\包编译器\ DoctrineBundle \ DependencyInjection \ \ DoctrineOrmMappingsPass”;如果(class_exists ($ormCompilerClass)) {$容器->addCompilerPass (DoctrineOrmMappingsPass::createXmlMappingDriver ($映射,数组(“fos_user.model_manager_name”),“fos_user.backend_type_orm”));}$mongoCompilerClass=的学说\包编译器\ MongoDBBundle \ DependencyInjection \ \ DoctrineMongoDBMappingsPass”;如果(class_exists ($mongoCompilerClass)) {$容器->addCompilerPass (DoctrineMongoDBMappingsPass::createXmlMappingDriver ($映射,数组(“fos_user.model_manager_name”),“fos_user.backend_type_mongodb”));}$couchCompilerClass=的学说\包编译器\ CouchDBBundle \ DependencyInjection \ \ DoctrineCouchDBMappingsPass”;如果(class_exists ($couchCompilerClass)) {$容器->addCompilerPass (DoctrineCouchDBMappingsPass::createXmlMappingDriver ($映射,数组(“fos_user.model_manager_name”),“fos_user.backend_type_couchdb”));}$phpcrCompilerClass=的学说\包编译器\ PHPCRBundle \ DependencyInjection \ \ DoctrinePhpcrMappingsPass”;如果(class_exists ($phpcrCompilerClass)) {$容器->addCompilerPass (DoctrinePhpcrMappingsPass::createXmlMappingDriver ($映射,数组(“fos_user.model_manager_name”),“fos_user.backend_type_phpcr”));}}}
注意class_exists检查。这是至关重要的,因为您不希望您的包对所有Doctrine包都有硬依赖,而是让用户决定使用哪个包。
编译器通道为Doctrine提供的所有驱动程序提供了工厂方法:注解、XML、Yaml、PHP和StaticPHP。论点如下:
- 绝对目录路径到命名空间的映射/哈希;
- 一个容器参数数组,您的bundle使用它来指定它正在使用的Doctrine管理器的名称。在上面的例子中,FOSUserBundle存储了在
fos_user.model_manager_name
参数。编译器传递将附加Doctrine用于指定默认管理器名称的参数。使用找到的第一个参数,并将映射注册到该管理器; - 一个可选的容器参数名,编译器传递将使用它来确定是否使用了此Doctrine类型。如果您的用户安装了不止一种类型的Doctrine包,但您的包只与一种类型的Doctrine一起使用,则这是相关的。
请注意
工厂方法使用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
私人函数buildMappingCompilerPass(){$参数=数组(数组(realpath (__DIR__.' /资源/ config / doctrine-base ')),“.orm.xml”);$定位器=新定义(”学说\常见\持久性映射\ \司机\ DefaultFileLocator ',$参数);$司机=新定义(”学说\ ORM映射\ \司机\ XmlDriver ',数组($定位器));返回新DoctrineOrmMappingsPass ($司机,数组(“充分\名称空间”),数组(“your_bundle.manager_name”),“your_bundle.orm_enabled”);}
现在将映射文件放入/ /配置/ doctrine-base资源
使用完全限定的类名,由.
而不是\
例如,Other.Namespace.Model.Name.orm.xml
.你不能把这两种混合在一起ob娱乐下载SymfonyFileLocator
会感到困惑。
针对其他原则实现进行相应调整。