Пользовательские ограничения проверки Symfony3 с параметрами генерируют исключение

Я пытался создать пользовательское ограничение проверки с параметрами, используя службы в Symfony3.

Проблема в том, что после отправки формы я получаю исключение:

Catchable Fatal Error: Argument 1 passed to OC\PlatformBundle\Validator\AntifloodValidator::__construct() must be an instance of Symfony\Component\HttpFoundation\RequestStack, none given, called in C:\wamp\www\Symfony\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Validator\ConstraintValidatorFactory.php on line 71 and defined

Я понимаю, что Symfony не мог гидрировать конструктор AntifloodValidator с параметрами, указанными в services.yml.

Вот мой код:

В services.yml:

oc_platform.validator.antiflood:
class: OC\PlatformBundle\Validator\AntifloodValidator
arguments: ['@request_stack', '@doctrine.orm.entity_manager']
tags:
- { name: validator.constraint_validator, alias: oc_platform_antiflood }

В Antiflood.php:

namespace OC\PlatformBundle\Validator;

use Symfony\Component\Validator\Constraint;

/**
* @Annotation
*/
class Antiflood extends Constraint
{
public $message = "Vous avez déjà posté un message il y a moins de 15 secondes, merci d'attendre un peu.";

public function validateBy()
{
return 'oc_platform_antiflood'; // Ici, on fait appel à l'alias du service
}
}

В AntifloodValidator.php:

namespace OC\PlatformBundle\Validator;

use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class AntifloodValidator extends ConstraintValidator
{
private $requestStack;
private $em;

// Les arguments déclarés dans la définition du service arrivent au constructeur
// On doit les enregistrer dans l'objet pour pouvoir s'en resservir dans la méthode validate()
public function __construct(RequestStack $requestStack, EntityManagerInterface $em)
{
$this->requestStack = $requestStack;
$this->em           = $em;
}

public function validate($value, Constraint $constraint)
{
...

И в Advert.php (моя сущность):

namespace OC\PlatformBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

use OC\PlatformBundle\Validator as CustomAssert;

/**
* Advert
*
* @ORM\Table(name="advert")
* @ORM\Entity(repositoryClass="OC\PlatformBundle\Repository\AdvertRepository")
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(fields="title", message="Une annonce existe déjà avec ce titre.")
*/
class Advert
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(name="date", type="datetime")
* @Assert\DateTime()
*/
private $date;

/**
* @ORM\Column(name="title", type="string", length=255, unique=false)
* @Assert\Length(min=10)
*/
private $title;

/**
* @ORM\Column(name="author", type="string", length=255)
* @Assert\Length(min=2)
*/
private $author;

/**
* @ORM\Column(name="content", type="text")
* @Assert\NotBlank()
* @CustomAssert\Antiflood
*/
private $content;

Несколько раз просмотрел документацию и ничего не нашел. То же самое и здесь, в stackoverflow.

Любая идея ?

2

Решение

Если вы внедряете в свой сервис (ограничение) стек запросов, он должен иметь такую ​​область запросов:

oc_platform.validator.antiflood:
class: OC\PlatformBundle\Validator\AntifloodValidator
arguments: ['@request_stack', '@doctrine.orm.entity_manager']
tags:
- { name: validator.constraint_validator, alias: oc_platform_antiflood }
scope: request
1

Другие решения

в антифлуд класс, функция должна называться validatedПо, а не проверять по …

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector