#4 ValidInvite constraint implemented.

This commit is contained in:
Alexey Skobkin 2018-06-30 02:52:53 +03:00
parent 16f8d1ff32
commit 01827680a1
3 changed files with 63 additions and 0 deletions

View File

@ -3,6 +3,7 @@
namespace App\FormRequest;
use Symfony\Component\Validator\Constraints as Assert;
use App\Validator\Constraints as AppAssert;
/**
* @todo implement UniqueEntity constraint for DTO and use it here
@ -37,6 +38,7 @@ class CreateUserRequest
*
* @Assert\NotBlank()
* @Assert\Length(min="32", max="32")
* @AppAssert\ValidInvite()
*/
public $inviteCode;

View File

@ -0,0 +1,19 @@
<?php
namespace App\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
/**
* @Annotation
*/
class ValidInvite extends Constraint
{
public $notFoundMessage = 'Invite {{ code }} not found.';
public $usedMessage = 'Invite {{ code }} is used.';
public function validatedBy(): string
{
return get_class($this).'Validator';
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace App\Validator\Constraints;
use App\Entity\Invite;
use App\Repository\InviteRepository;
use Symfony\Component\Validator\{Constraint, ConstraintValidator};
class ValidInviteValidator extends ConstraintValidator
{
/** @var InviteRepository */
private $inviteRepo;
public function __construct(InviteRepository $inviteRepo)
{
$this->inviteRepo = $inviteRepo;
}
/**
* @param mixed $value
* @param ValidInvite $constraint
*/
public function validate($value, Constraint $constraint)
{
/** @var Invite $invite */
if (null === $invite = $this->inviteRepo->findOneBy(['code' => $value])) {
$this->context->buildViolation($constraint->notFoundMessage)
->setParameter('{{ code }}', $value)
->addViolation()
;
return;
}
if (null !== $invite->getUsedBy()) {
$this->context->buildViolation($constraint->usedMessage)
->setParameter('{{ code }}', $value)
->addViolation()
;
}
}
}