如何提供几个原则实现的模型类

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。

这个页面的更新版本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和(unversioned) CouchDBBundle支持编译器通过自CouchDB编译器通过将请求映射被合并。

在你的包类,编写下面的代码编译器通过注册。这个是写给CmfRoutingBundle,所以部分需要适应你的情况:

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 59
使用学说\\DoctrineBundle\DependencyInjection\编译器\DoctrineOrmMappingsPass;使用学说\\MongoDBBundle\DependencyInjection\编译器\DoctrineMongoDBMappingsPass;使用学说\\CouchDBBundle\DependencyInjection\编译器\DoctrineCouchDBMappingsPass;使用学说\\PHPCRBundle\DependencyInjection\编译器\DoctrinePhpcrMappingsPass;使用ob娱乐下载\Cmf\RoutingBundle\模型;CmfRoutingBundle扩展{公共函数构建(ContainerBuilder美元容器){::构建(美元容器);/ /……美元modelDirectory= realpath (__DIR__“/资源/ config /理论/模型”);美元映射=数组(美元modelDirectory= >模型::类);如果(class_exists (DoctrineOrmMappingsPass::类)){美元容器- >addCompilerPass (DoctrineOrmMappingsPass::createXmlMappingDriver (美元映射,数组(“cmf_routing.model_manager_name”),“cmf_routing.backend_type_orm”,数组(“CmfRoutingBundle”= >模型::类)));}如果(class_exists (DoctrineMongoDBMappingsPass::类)){美元容器- >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检查。这是至关重要的,因为你不希望你的包有一个硬依赖学说包但让用户决定使用哪一个。

编译器将为司机提供的原则:提供工厂方法注释、XML、Yaml、PHP和StaticPHP。的参数是:

  • 一个绝对目录路径/散列映射到名称空间;
  • 包使用的数组容器参数指定的名称学说经理使用。在上面的示例中,CmfRoutingBundle存储管理器名称下被使用cmf_routing.model_manager_name参数。编译器将会附加参数传递原则是使用指定默认的经理的名字。第一个参数发现使用和经理的映射注册;
  • 容器一个可选的参数名称将使用编译器通过确定如果使用这种学说。这是有关如果用户有超过一种类型的学说包安装,但是你的包是只使用一种学说;
  • 一个/散列别名映射到名称空间。这应该是相同的约定主义所使用的自动映射。在上面的示例中,这允许用户调用$ om - > getRepository (CmfRoutingBundle:路线)

请注意

使用工厂方法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 14 15 16 17 18 19 20
使用学说\常见的\持久性\映射\司机\DefaultFileLocator;使用学说\ORM\映射\司机\XmlDriver;使用AppBundle\模型;/ /……私人函数buildMappingCompilerPass(){美元fileLocator=定义(DefaultFileLocator::类,数组(数组(realpath (__DIR__' /资源/ config / doctrine-base ')),“.orm.xml”));美元司机=定义(XmlDriver::类,数组(美元fileLocator));返回DoctrineOrmMappingsPass (美元司机,数组(模型::类),数组(“your_bundle.manager_name”),“your_bundle.orm_enabled”);}

注意,您不需要提供一个命名空间别名,除非用户预计问教义的基类。

现在把你的映射文件/ /配置/ doctrine-base资源完全限定类名,隔开而不是\例如,Other.Namespace.Model.Name.orm.xml。你可能不混合两个另有ob娱乐下载SymfonyFileLocator会感到困惑。

调整相应的其他原则的实现。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。