LoginSignup
2
3

More than 5 years have passed since last update.

Laravel validation/active-urlの使い方

Posted at

validationのactive-urlはドメインチェックだけをする

validationをかけるときに 
active-urlだからとなにも考えず
引数にURLをつかってしまうとvalid出来ずにハマる。

リファレンスにもそう書いてあるし!!!

active_url
フィルドがPHPの機能であるcheckdnsrrを通して、有効なURLであるかをバリデートします。
http://readouble.com/laravel/4/2/0/ja/validation.html#rule-active-url

checkdnsrr…だ、と。

実際に使ってみた

検証用コード

demo.php
        // validation設定
        $rule = ['url' => 'active_url'];
        $input = ['url' => $url];
        $validator = Validator::make($input, $rule);
        //生きたURLかチェック
        if ($validator->fails()) {
             echo '\inactive URL/';
        } else{
             echo '\active URL/';
        }

検証① http://allabout.co.jp

結果:\active URL/

検証② http://yahoo.co.jp

結果:\inactive URL/

検証③ http://allabout.co.jp/gm/gc/447800/

結果:\inactive URL/
実際はactiveなURLなんですけどね(・ω・`)

Laravel内の実装

validationで使われる関数 validateActiveUrl

/vendor/laravel/framework/src/Illuminate/Validation/Validator.php

    /**
     * Validate that an attribute is an active URL.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    protected function validateActiveUrl($attribute, $value)
    {
        $url = str_replace(array('http://', 'https://', 'ftp://'), '', strtolower($value));

        return checkdnsrr($url);
    }

Checkdnsrr とは

bool checkdnsrr ( string $host [, string $type = "MX" ] )
host に対応する type 型のレコードを DNS から探します。
http://php.net/manual/ja/function.checkdnsrr.php

つまり…

上手くいく

http://allabout.co.jp
→checkdnsrr('allabout.co.jp')
true!!!

意図した結果にならない

http://allabout.co.jp/gm/gc/447800
→checkdnsrr('allabout.co.jp/gm/gc/447800')
false!!

所感

  • リファレンスはちゃんと読もう
  • active-urlって書いてあるけどURLを素直に引き渡してはいけない
2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3