我一直在尝试使用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无法使用services.yml.中给出的参数对AntifloodValidator的构造函数进行水合
这是我的代码:
服务中。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;
In多次查看文档,但没有发现任何内容。stackoverflow也是如此。
知道吗?
如果要向服务(Constraint)注入请求堆栈,它应该有一个如下的请求范围:
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
在Antiflood类中,函数必须命名为validatedBy,而不是validateBy。。。