在 Symfony2 中检测实体配置错误

Posted

技术标签:

【中文标题】在 Symfony2 中检测实体配置错误【英文标题】:Detecting an entity mis-configuration in Symfony2 【发布时间】:2013-01-06 21:14:17 【问题描述】:

好吧,我不知道如何修复我的项目中的错误。

我正在尝试处理具有多对多属性关系的嵌套表单。 错误表明它无法创建关联,因为其中一方需要 ID。

好的。所以我试图只创造缺失的一面。 但还是同样的错误。

最后,我意识到这个简单的代码仍然存在同样的问题:

public function onSuccess(Page $page)
   
    $this->em->flush();

如果您收到诸如“嘿,没有什么可刷新的!”之类的错误消息,我将不胜感激。 但是不,仍然是同样的错误:我必须先创建对象(及其 id)才能关联它。

我查看了堆栈跟踪。是的,似乎 UnitOfWork ->computeAssociationChanges 在刷新后被调用,并且需要关联对象的 Id。

如果 flush 命令产生错误,我如何在数据库中创建对象?

【问题讨论】:

你使用什么 id 生成策略?教义 2 手册中的第 4.8 节。如果它是自动的,那么你不需要在冲洗时做任何特别的事情。如果您使用手动策略,则需要在刷新之前创建 id。可能会考虑创建一个命令对象并测试您的模型,而无需经过所有的表单处理。 感谢您的回答(很抱歉这么晚才回复...)。我的大多数表都是在 auto.id 中生成的。只有一张桌子不是。这是保存多对多关系属性的表。因此,它只有每边的两个 id 和属性。我同意我需要先拥有两个 ID 才能建立这种关系。什么是命令对象?我如何使用它来测试模型? 【参考方案1】:

问题是由于实体类中的一个重大拼写错误。 我通过使用 Symfony 的附加组件检查架构结构找到了它:

<?php
namespace Lp\LibBundle\Command;

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Bundle\DoctrineBundle\Command\Proxy\DoctrineCommandHelper;
use Doctrine\ORM\Tools\Console\Command\ValidateSchemaCommand;

class MyValidateSchemaCommand extends ValidateSchemaCommand


/**
 * (non-PHPdoc)
 * @see Tools/Console/Command/Doctrine\ORM\Tools\Console\Command.ValidateSchemaCommand::configure()
 * 
 * Modifies name of the command to be in Doctrine namespace
 * Adds the Helper em for the entity manager which is not defined in Doctrine class 
 * @author ulrich, 09/09/11
 */
protected function configure()

    parent::configure();
    $this->setName('doctrine:orm:validate-schema');
    $this->addOption('em', null, InputOption::VALUE_OPTIONAL, 'The entity manager to use for this command');


/**
 * (non-PHPdoc)
 * @see Tools/Console/Command/Doctrine\ORM\Tools\Console\Command.ValidateSchemaCommand::execute()
 * 
 * Ajoute le Helper em pour l'entity manager qui n'est pas définis dans la class Doctrine
 * @author ulrich, 09/09/11
 */
protected function execute(InputInterface $input, OutputInterface $output)

    DoctrineCommandHelper::setApplicationEntityManager($this->getApplication(), $input->getOption('em'));

            return parent::execute($input, $output);

Source: Ulrich

这允许使用该命令指令来检测实体拼写错误。

> php app/console doctrine:orm:validate-schema

【讨论】:

以上是关于在 Symfony2 中检测实体配置错误的主要内容,如果未能解决你的问题,请参考以下文章

另一个未知实体命名空间别名错误(Symfony2,手动创建的实体)

使用 Monolog 在 Symfony2 中记录 PHP 致命错误

Symfony2 Monolog 配置为使用 raven 处理程序(Sentry)

Symfony2 - 在链配置的命名空间中找不到类“X”

Symfony2 教义关联映射错误处理

添加然后删除索引后核心数据错误“错误配置的实体:在复合索引属性中...不是有效属性”