对于 Symfony Validator Component,是否可以强制验证从实现 EventSubscriberInterface 的 class 失败
For Symfony Validator Component is it possible to force validation to fail from a class that implements EventSubscriberInterface
我有以下代码;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
$builder->create(
'href',
'url',
$this->getOptionsForUrlWidget('Website URL')
)->addEventSubscriber(new GetResolvedUrlListener())
)
...
我的方法 GetResolvedUrlListener
执行 curl 请求以发现正确的协议和最终地址(在重定向之后)以确定正确的 url.
我希望它在 curl 请求未收到成功的 HTTP 响应时导致验证失败。因此,如果提供的 url 不可访问,则不应保存。
这可以在实现 EventSubscriberInterface 的 class 中完成吗?我是否应该添加一个新约束并验证提供的 url 两次?
您应该添加一个约束,但您不一定要验证它两次,您可以创建一个中央服务来解析这些 url,但也将它们保留在两个 $validUrls
和 [=12] 中=] 属性,然后您可以在 您的事件侦听器和验证约束 中使用此服务,该服务可能如下所示:
class UrlValidator{
protected $validUrls = array();
protected $invalidUrls = array();
public function resolve($url){
// we have validated this url before, and it wasn't valid
if(isset($this->invalidUrls[$url])
return false;
// we have validated this url before, so we can return true or the resolved value
if(isset($this->validUrls[$url])
return $this->validUrls[$url];
else{
// do the curl request, and set $this->validUrls[$urls] or $this->invalidUrls[$url] accordingly
}
}
}
我有以下代码;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
$builder->create(
'href',
'url',
$this->getOptionsForUrlWidget('Website URL')
)->addEventSubscriber(new GetResolvedUrlListener())
)
...
我的方法 GetResolvedUrlListener
执行 curl 请求以发现正确的协议和最终地址(在重定向之后)以确定正确的 url.
我希望它在 curl 请求未收到成功的 HTTP 响应时导致验证失败。因此,如果提供的 url 不可访问,则不应保存。
这可以在实现 EventSubscriberInterface 的 class 中完成吗?我是否应该添加一个新约束并验证提供的 url 两次?
您应该添加一个约束,但您不一定要验证它两次,您可以创建一个中央服务来解析这些 url,但也将它们保留在两个 $validUrls
和 [=12] 中=] 属性,然后您可以在 您的事件侦听器和验证约束 中使用此服务,该服务可能如下所示:
class UrlValidator{
protected $validUrls = array();
protected $invalidUrls = array();
public function resolve($url){
// we have validated this url before, and it wasn't valid
if(isset($this->invalidUrls[$url])
return false;
// we have validated this url before, so we can return true or the resolved value
if(isset($this->validUrls[$url])
return $this->validUrls[$url];
else{
// do the curl request, and set $this->validUrls[$urls] or $this->invalidUrls[$url] accordingly
}
}
}