我有一个名为EC-cube的应用程序,运行在Symfony 2.7.9之上。
我的任务是添加"功能"到该应用程序,但不触摸现有代码 我能做的是创建新元素(实体,控制器)或通过提供的一些事件挂钩它们。
我想要做的是向现有实体添加一些字段。就此而言,我创建了一个包含新数据的实体,并通过主键将其映射到原始实体=>我有2张桌子。
我设法通过" hooks"在表单中显示新字段。通过将我的表单类型添加到我在事件方法中作为参数接收的原始formBuilder。
效果很好,表单已发送,我设置了另一个事件来接收表单数据并更新/保存我的实体。
现有实体:客户
扩展实体:MyCustomer
新实体:UserCustom(添加了新字段)。
以下是实体:
class MyCustomer extends Customer {
// no changes, I just want a new name to use the regarding YML file to add a relation
}
class UserCustom extends \Eccube\Entity\AbstractEntity {
private $id;
private $dog_name;
// other things and setters/getters
// ...
}
cdm.yml
个文件
用于扩展现有客户实体:
Plugin\UserCustom\Entity\MyCustomer:
type: entity
table: dtb_customer # that table already exists
# I removed all columns definition in that file and just customized the repo and added the relation I want
repositoryClass: Plugin\UserCustom\Repository\MyCustomerRepository
oneToOne:
Details:
targetEntity: Plugin\UserCustom\Entity\UserCustom
joinColumn:
name: customer_id
referencedColumnName: customer_id
一对一关系是关键点。
对于新数据:
Plugin\UserCustom\Entity\UserCustom:
type: entity
table: plg_user_custom
repositoryClass: Plugin\UserCustom\Repository\UserCustomRepository
id:
id:
type: integer
nullable: false
unsigned: false
id: true
column: customer_id
generator:
strategy: NONE
fields:
dog_name:
type: text
nullable: true
mailmaga:
type: integer
nullable: true
lifecycleCallbacks: { }
然后我可以使用MyCustomer覆盖Pimple中的Customer实体,并向与其相关的存储库添加了一些逻辑(MyCustomerRepository)。
它很棒。
逻辑正在按我的意愿运行,但我无法迁移(migrate:diff等...),因为表dtb_customer
存在2个实体:Customer
和{{ 1}}。
我该怎么办?最简单的想法是使迁移忽略现有表。
现在我手工编辑表格,但它很容易出错,我认为不好。
我不是Symfony的主人,这对我来说似乎是压倒性的,因此我的问题可能听起来很简单甚至无关紧要......
答案 0 :(得分:0)
您可以通过yml OR或注释进行映射。所以你不需要两者。
然后行$app['eccube.repository.customer']->getQueryBuilderBySearchData($searchData);
似乎是一个疙瘩容器。不是symfonys DIC。
要解决您的问题,您应该尝试使用海关连接扩展原始存储库类,并将该类注入$app['eccube.repository.customer']
。这意味着,您不会触摸控制器代码。只需覆盖getQueryBuilderBySearchData()
方法即可。