У меня есть следующий код;
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? Должен ли я добавить новое ограничение и дважды проверить указанный URL?
Вы должны добавить ограничение, но вам не обязательно проверять его дважды, вы можете создать центральную службу, которая разрешает эти URL, но также сохраняет их для себя в двух $validUrls
а также $invalidUrls
свойства, вы можете использовать этот сервис в и ваш слушатель событий и в вашем ограничении проверки, сервис может выглядеть примерно так:
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
}
}
}
Других решений пока нет …