最后,以下的建议和Symfony documentation我选择了这个解决方案:
约束类
<?php
namespace MyBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*
*/
class UniquePendingCart extends Constraint
{
public $message = 'Only one pending cart by user';
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
public function validatedBy()
{
return 'my.validator.unique_pending_cart';
}
}
验证服务 注入我CartRepository
服务:
my.validator:
class: AppBundle\Validator\Constraints\UniquePendingCartValidator
arguments:
- @my.cart_repository
tags:
- name: validator.constraint_validator
- alias: my.validator.unique_pending_cart
约束验证类
<?php
namespace MyBundle\Validator\Constraints;
use Doctrine\Common\Persistence\ObjectRepository;
use Symfony\Component\PropertyAccess\PropertyAccess;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Bshop\AppBundle\Model\Interfaces\OrderInterface;
class UniquePendingCartValidator extends ConstraintValidator
{
protected $repository;
public function __construct(ObjectRepository $repository)
{
$this->repository = $repository;
}
public function validate($value, Constraint $constraint)
{
if (!$constraint instanceof UniquePendingCart) {
throw new UnexpectedTypeException($constraint,
__NAMESPACE__.'\UniquePendingCart');
}
$isValid = $this->isStatusValid($value);
if (!$isValid) {
$this->context->buildViolation($constraint->message)
->addViolation();
}
}
protected function isStatusValid($cart)
{
// use repository to find another possible pending cart
return true;
}
}
然后在我的Cart
实体申请约束现在
<?php
use Doctrine\ORM\Mapping as ORM;
use MyBundle\Validator\Constraints as MyAssert;
/**
* @ORM\Entity
* @MyAssert\UniquePendingCart
*/
class Cart {
// ...
}
,我可以验证$车,并验证是否有效?
$cart = // my cart
$validator = $this->get("validator");
$errors = $validator->validate($cart);
if (0 !== count($errors)) {
// ops, exception...
}
止跌在创建新的产品之前,更容易检查用户是否已经拥有待定购物车? – 2015-02-23 12:14:30
也这么认为,添加一个方法hasPending()检查,如果(!$ e-> hasPending()){add()} – 2015-02-23 12:18:32
@Daniel和约翰,也许是最好的解决方案,谢谢。我的用户有一个方法getCurrentCart(),我在过滤“待处理”购物车,我可以检查$ user-> hasCurrentCart(),然后创建一个新的。谢谢。 – xhostar 2015-02-23 14:08:27