我学习学说,我有一个表格.ZF2和学说与字段"电子邮件".这个字段必须是唯一的,所以我需要验证器.我也使用了字段集(这里很重要).问题是,当我使用时:
DoctrineModule\Validator\UniqueObject
Run Code Online (Sandbox Code Playgroud)
创建新实体是不可能的.此验证器需要主键进行比较.验证器转储错误消息:
包含itemId的预期上下文
itemId是我的主键.
显而易见,我需要使用UniqueObject进行更新,并且:
DoctrineModule\Validator\NoObjectExists
Run Code Online (Sandbox Code Playgroud)
对于新实体.问题是:
为现有实体和新实体存储不同的输入过滤器规范的最佳方法是什么?
或者,如果可能的话,更好:如何使用具有zend表单字段集的新记录和现有记录的唯一验证程序.
如果我把它放在表单中,我需要在控制器内修改它,如果实体是新的或没有.不太好主意.
我认为最好的方法是存储输入过滤规范.在实体存储库内部,但我如何检查实体是否是新的?
----编辑
我看到文档,我知道如何使用唯一对象但我有如前所述的错误:"包含itemId的预期上下文".我认为问题在于字段集(即时使用它).我不明白该怎么做(文档中的文字):
如果省略use_context选项或将其设置为false,则必须将包含fields-和identifier-values的数组传递给isValid().使用Zend\Form时,如果您正在使用fieldsets,则需要此行为 .
好吧我使用现场集,所以现在我能做什么?我在使用zend表单时如何将正确的值传递给isValid?
我想创建带有分类词汇表的 Tag 实体类,它将被多个实体使用。有没有可能,用三列创建多条关系?我需要存储标签 id、实体 id 和实体类名。
所以我现在有:
<?php
/**
* Taxonomy
*
* @ORM\Table(
* name="tag_taxonomy",
* indexes={
* @ORM\Index(name="tag_taxonomy_namex", columns={"name"})
* }
* )
* @ORM\HasLifecycleCallbacks
* @ORM\Entity
*/
class Taxonomy
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORM\Column(name="name", type="string", length=50)
*/
protected $name;
/**
* @ORM\OneToMany(targetEntity="Tag", mappedBy="taxonomy", fetch="LAZY")
*/
protected $tags;
// .....
}
Run Code Online (Sandbox Code Playgroud)
标签表:
<?php
/**
* Tag
*
* @ORM\Table(
* name="tag", …Run Code Online (Sandbox Code Playgroud) 我有Vuex的电子应用程序。使用模块(我的测试模块Browser.js)为整个应用配置了商店:
export default {
namespaced: true,
state: {
currentPath: 'notSet'
},
mutations: {
setPath (state) {
state.currentPath = 'xxxx'
}
},
actions: {
updateCurrentPath ({ commit }) {
console.log('COMMIT')
commit('setPath')
}
},
getters: {
getCurrentPath (state) {
return state.currentPath
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在组件Im中尝试分发更新操作失败。吸气剂工作正常:
mounted () {
console.log('mounted')
console.log('# GET FROM STORE:', this.$store.getters['Browser/getCurrentPath'])
console.log('# DISPATCH:', this.$store.dispatch('Browser/updateCurrentPath'))
console.log('# GET FROM STORE 2:', this.$store.getters['Browser/getCurrentPath'])
},
Run Code Online (Sandbox Code Playgroud)
安慰:
mounted
Browser.vue?31a5:62 # GET FROM STORE: notSet
Browser.vue?31a5:63 # DISPATCH: undefined
Browser.vue?31a5:64 # GET FROM STORE 2: …Run Code Online (Sandbox Code Playgroud)