Symfony 2,Doctrine 2 - 如何验证删除父子关系
Symfony 2, Doctrine 2 - How to validate deleting child-parent relation
我有 Section (Parent)、Language(child) 和 Currency(child) 实体。它们的属性通常通过 Validator 进行验证,但我有问题如何检查用户是否想要删除与 Section 实体连接的 Currency 或 Language 实体。 Symfony 抛出异常:
An exception occurred while executing 'DELETE FROM Language WHERE id = ?'
with params [5]: SQLSTATE[23000]: Integrity constraint violation: 1451
Cannot delete or update a parent row: a foreign key constraint fails
(`mywork`.`section`, CONSTRAINT `FK_E2CE437382F1BAF4` FOREIGN KEY
(`language_id`) REFERENCES `language` (`id`))
我想捕获此异常并正常发送消息,说明发生了什么。我知道我可以通过 try catch 块捕获这个错误,但在我看来这不是 Symfony 中的正确解决方案。而且我不知道如何从 Doctrine\DBAL\DBALException.
获取错误代码
我想找到类似于 Validator 的解决方案。如果 属性 没有正确的值,消息将发送给用户(客户端)。例如:
My\WebBundle\Entity\Highlight:
properties:
abbreviation:
- NotBlank:
message: "The abbreviation must be not empty."
- Length:
max: 8
maxMessage: "Error value <strong>{{ value }}</strong> - The abbreviation can contain max {{ limit }} characters."
我对如何捕获唯一记录和为用户写消息有同样的问题。
使用Class Constraint Validator
这样在验证函数中:
// ...
if ($language->getSection() !== NULL) {
// If you're using the new 2.5 validation API (you probably are!)
$this->context->buildViolation($constraint->message)
->atPath('section')
->addViolation();
// If you're using the old 2.4 validation API
/*
$this->context->addViolationAt(
'section',
$constraint->message,
array(),
null
);
*/
}
检查唯一约束的方法相同,但我认为更好的主意是使用 bild-in validator
编辑:
如果我没看错,你就有如下所示的父子关系。尝试使用 preRemove LifeCycleCallbacks
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Parent
{
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Child", mappedBy="parent")
*/
private $children;
/**
* @ORM\PreRemove
*/
public function deleteAllChildren()
{
//prevent
foreach ($this->getChildren() as $child) {
$this->children->removeElement($child);
$child->setParent(NULL);
}
}
}
我有 Section (Parent)、Language(child) 和 Currency(child) 实体。它们的属性通常通过 Validator 进行验证,但我有问题如何检查用户是否想要删除与 Section 实体连接的 Currency 或 Language 实体。 Symfony 抛出异常:
An exception occurred while executing 'DELETE FROM Language WHERE id = ?'
with params [5]: SQLSTATE[23000]: Integrity constraint violation: 1451
Cannot delete or update a parent row: a foreign key constraint fails
(`mywork`.`section`, CONSTRAINT `FK_E2CE437382F1BAF4` FOREIGN KEY
(`language_id`) REFERENCES `language` (`id`))
我想捕获此异常并正常发送消息,说明发生了什么。我知道我可以通过 try catch 块捕获这个错误,但在我看来这不是 Symfony 中的正确解决方案。而且我不知道如何从 Doctrine\DBAL\DBALException.
获取错误代码我想找到类似于 Validator 的解决方案。如果 属性 没有正确的值,消息将发送给用户(客户端)。例如:
My\WebBundle\Entity\Highlight:
properties:
abbreviation:
- NotBlank:
message: "The abbreviation must be not empty."
- Length:
max: 8
maxMessage: "Error value <strong>{{ value }}</strong> - The abbreviation can contain max {{ limit }} characters."
我对如何捕获唯一记录和为用户写消息有同样的问题。
使用Class Constraint Validator 这样在验证函数中:
// ...
if ($language->getSection() !== NULL) {
// If you're using the new 2.5 validation API (you probably are!)
$this->context->buildViolation($constraint->message)
->atPath('section')
->addViolation();
// If you're using the old 2.4 validation API
/*
$this->context->addViolationAt(
'section',
$constraint->message,
array(),
null
);
*/
}
检查唯一约束的方法相同,但我认为更好的主意是使用 bild-in validator
编辑: 如果我没看错,你就有如下所示的父子关系。尝试使用 preRemove LifeCycleCallbacks
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Parent
{
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="Child", mappedBy="parent")
*/
private $children;
/**
* @ORM\PreRemove
*/
public function deleteAllChildren()
{
//prevent
foreach ($this->getChildren() as $child) {
$this->children->removeElement($child);
$child->setParent(NULL);
}
}
}