我在这里需要一些建议。我在一个使用Doctrine 2和Doctrine Orm模块的ZF2项目中。我使用教义模块提供的服务来处理身份验证。结果是,在身份验证之后,我的身份验证服务中具有作为用户实体实例的身份(由getIdentity()方法返回)。
我有两个实体:用户和组。在用户实体与组之间定义了多对一关系(一个用户属于一个组,一个组具有多个用户)。基本的东西。
当连接的用户需要去编辑它在CRUD中自己的组时,我的问题就来了。
处理CRUD的方法很简单:我在实体的注释中定义了表单,并指定了“ Doctrine Hydrator”并使用“ Doctrine Object Select”。除了编辑自己的小组外,所有事情都可以完美地发挥作用。
我的理解是:由于我的多对一关系处于延迟加载获取模式,因此在身份验证后,原则的身份映射包含用户组作为代理的实例。当用户进行编辑操作时,将发生以下情况:
/*
Code that get the goup id to edit from request
*/
if (!empty($id)) {
$entity = $groupRepository->find($id);
}
$builder = new AnnotationBuilder();
$this->form = $builder->createForm($entity);
结果是,当将不在学说身份映射中的任何组作为代理实例进行编辑时,一切都会好起来的。但是,如果我需要编辑的实体已经作为代理实例存在于身份映射中,则表单工厂将找不到在我的实体中定义的注释,并且注释会中断。也许我的方式是不好的做法?我想使用批注构建表单。
我唯一能找到的解决方法(我猜这是一种糟糕的方法)是这样更改我的代码:
/*
Code that get the goup id to edit from request
*/
if (!empty($id)) {
$em->clear(); <== NEW LINE HERE
$entity = $groupRepository->find($id);
}
$builder = new AnnotationBuilder();
$this->form = $builder->createForm($entity);
从理论上讲,在我的用例中,调用clear()来分离所有实体应该不是问题,因为我知道我只想编辑组实体,但是我想这可能不是正确的选择。
另一个解决方案(但尚未尝试):创建一个自定义FormFactory,并将其传递给AnnotationBuilder。然后,此自定义FormFactory将在从注释启动表单创建之前检测实体的类型。如果它是代理,则应该获取“真实”类的注释?
还是我错过了一些简单的事情?
当您通过代理服务器时,这不能正常工作,我感到有些惊讶,但是我同意您当前的解决方案很糟糕:)。您可以这样解决问题:
// collect the class from the entity or proxy
$className = \Doctrine\Common\Util\ClassUtils::getClass($entity);
$builder = new AnnotationBuilder();
$this->form = $builder->createForm($className);
传递类名时,注释生成器运行良好。上面的代码从代理对象和实体中收集真实的类名,因此这在两种情况下都适用。
但是我仍然建议检查您的配置,因为我几乎可以确定它也可以与代理一起正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句