1

次のコードがあります。

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 を 2 回検証する必要がありますか?

4

1 に答える 1

0

制約を追加する必要がありますが、必ずしも 2 回検証する必要はありません。これらの URL を解決するだけでなく、それ自体を 2 つ$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
        }
    }
}
于 2015-09-04T05:51:58.377 に答える