如何提供几个原则实现的模型类
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何提供几个原则实现的模型类
当构建一个包可以与教义不仅使用ORM CouchDB ODM, MongoDB ODM或PHPCR ODM,你仍然应该只写一个模型类。原则包提供一个编译器通过注册为您的模型类的映射。
请注意
对于一次性使用的包,最简单的方法是把你的模型类在默认位置:实体
教义的ORM或文档
的odm。可重用的包,而不是复制模型类来自动映射,使用编译器通过。
2.3
基本映射编译器通过是在Symfony 2.3中引入的。ob娱乐下载原则包从1.3.0 DoctrineBundle > =版本支持它,MongoDBBundle > = 3.0.0 PHPCRBundle > = 1.0.0-alpha2和(unversioned) CouchDBBundle支持编译器通过自CouchDB编译器通过将请求映射被合并。
如果你想让你的包支持旧版本的Symfony和教义,您可以提供一份编译器通过在你的包。ob娱乐下载看到例如FOSUserBundle映射配置addRegisterMappingsPass
。
在你的包类,编写下面的代码编译器通过注册。这个是写给FOSUserBundle,所以部分需要适应你的情况:
1 2 3 4 5 6 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检查。这是至关重要的,因为你不希望你的包有一个硬依赖学说包但让用户决定使用哪一个。
编译器将为司机提供的原则:提供工厂方法注释、XML、Yaml、PHP和StaticPHP。的参数是:
- 一个绝对目录路径/散列映射到名称空间;
- 包使用的数组容器参数指定的名称学说经理使用。在上面的例子中,FOSUserBundle存储管理器名称下被使用
fos_user.model_manager_name
参数。编译器将会附加参数传递原则是使用指定默认的经理的名字。第一个参数发现使用和经理的映射注册; - 容器一个可选的参数名称将使用编译器通过确定如果使用这种学说。这是有关如果用户有超过一种类型的学说包安装,但是你的包只使用一种类型的学说。
请注意
使用工厂方法ob娱乐下载SymfonyFileLocator
的教条,这意味着它只能看到XML和YML映射文件如果它们不包含完整的名称空间作为文件名。这是通过设计:ob娱乐下载SymfonyFileLocator
用假设文件只是简单的“空头”版本类文件名(例如。BlogPost.orm.xml
)
如果你还需要地图一个基类,你可以注册一个编译器通过的DefaultFileLocator
像这样。这段代码仅仅是来自DoctrineOrmMappingsPass
和适应使用DefaultFileLocator
而不是ob娱乐下载SymfonyFileLocator
:
1 2 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
会感到困惑。
调整相应的其他原则的实现。