3

次のSymfony2 cookbook tutorialに従いましたが、エラーが発生し続けます

constraint myContraintClass cannot be put on properties or getters

私が持っているvalidation.ymlに

Core\Entity\Activity:
  properties:
    maxTotalParticipant:
      - Application\ActivityBundle\Validator\ActivityMaxTotalParticipant: ~

ここに私の制約があります

<?php
namespace Application\ActivityBundle\Validator;
use Symfony\Component\Validator\Constraint;
/**
 * @Annotation
 */
class ActivityMaxTotalParticipant extends Constraint
{
  public $message = 'trigger error';

  public function validatedBy() {
    return 'activity_max_total_participant_validator';
  }

  public function getTargets() {
    return self::CLASS_CONSTRAINT;
  }

  public function getMessage() {
    return $this->message;
  }
}

と私の制約バリデーター

<?php 
 namespace Application\ActivityBundle\Validator;
 use Symfony\Component\Validator\ExecutionContext;
 use Symfony\Bundle\DoctrineBundle\Registry;
 use myApp\Core\Entity\Activity;
 use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\ConstraintValidator;
 use Symfony\Component\Translation\Translator;
 use Symfony\Component\Translation;

 class ActivityMaxTotalParticipantValidator extends ConstraintValidator
 {
    private $doctrine;
    private $translator;

    public function __construct(Registry $doctrine, Translator $translator){
        $this->doctrine = $doctrine;
        $this->translator = $translator;
    }

    /**
     * @param : $value {Activity object}
     * @param : $constraint {ActivityMaxTotalParticipant object}
     * */
    public function isValid( $value, Constraint $constraint) {
      if($value->getId() !== null) { return true; }
      return false;
    }

    private function isMaxTotalParticipantGreaterThanActualParticipants(Activity $activity, ExecutionContext $context){
      $activityUser = $this->doctrine->getEntityManagerForClass('myApp\Core\Entity\ActivityUser')->getRepository('myApp\Core\Entity\ActivityUser')->countNumberParticipantByActivityId($value->getId());
      if($activityUser > $activity->getMaxTotalParticipant() && $activity->getMaxTotalParticipant() !== null) {
        $propertyPath = $this->context->getPropertyPath().'.maxTotalParticipant';
        $this->context->setPropertyPath($propertyPath);
        $this->context->addViolation($constraint->message, array(), null);
        return false;
      }
      return true;
   }

   private function isMaxTotalParticipantGreaterEqualOne(Activity $activity, ExecutionContext $context)
   {
     $maxTotalParticipant = $activity->getMaxTotalParticipant();
     if ($activity->getNumberOfPlacesLimited() == 1 && ($maxTotalParticipant == null || trim($maxTotalParticipant) == '' || $maxTotalParticipant < 1) )  {           
            return false;
     }
     return true;
   }
}
4

1 に答える 1

19

の戻り値をgetTargets()に変更する必要がありself::PROPERTY_CONSTRAINTます。つまりself::CLASS_CONSTRAINT、制約はクラス レベルでのみ設定できますが、プロパティ レベル (たとえば、この$maxTotalParticipant場合のプロパティ) では設定できません。

于 2012-11-20T13:45:19.800 に答える