2015-09-03 55 views
1

我有以下代碼;對於Symfony驗證器組件是否有可能強制驗證失敗的類實現EventSubscriberInterface

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
    ->add(
     $builder->create(
      'href', 
      'url', 
      $this->getOptionsForUrlWidget('Website URL') 
      )->addEventSubscriber(new GetResolvedUrlListener()) 
     ) 
... 

我的方法GetResolvedUrlListener確實捲曲請求以發現正確的協議和最終地址(以下重定向),以確定正確的URL。

我希望它會導致驗證失敗,如果curl請求沒有收到成功的HTTP響應。所以如果提供的url不可訪問,它不應該保存。

這可以在實現EventSubscriberInterface的類中完成嗎?我應該添加一個新的約束並驗證提供的url兩次嗎?

回答

0

您應該添加一個約束,但你不一定要驗證它兩次,你可以創建一個解決這些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 
     } 
    } 
}