Laravel雄辩的域名规则

时间:2017-11-05 13:51:46

标签: php laravel eloquent

域名是否有任何具体规则?谷歌搜索大约一个小时,但没有获得规则列表。 我已经尝试了"domain" => "required|url",但它已经在其中修改了协议类型,因此对我来说这不是最好的选择。

1 个答案:

答案 0 :(得分:10)

我使用自定义规则检查有效的FQDN。

从这里获得另一个答案的正则表达式@ SO,参见:fully-qualified-domain-name-validation

其中一个答案提供了一个正则表达式,例如:

/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i

使用演示:http://regexr.com/3g5j0向您显示匹配项。

Laravel 5.5

然后我创建了一个自定义规则:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class FQDN implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return preg_match('/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i', $value);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'Invalid FQDN.';
    }
}

并像这样使用它:

// ...
use App\Rules\FQDN;

// ...
$this->validate($request, [
    // other rules be here
    'fqdn' => [
        'required',
        new FQDN(),
    ],
]);

编辑Laravel 5.4

在Laravel 5.4中,您没有规则合同,您可以在AppServiceProvider中扩展验证器,请参阅here(或创建单独的ExtendedValidationServiceProvider)。

您可以内联执行此操作,但我更喜欢为此设置单独的类。

在ServiceProvider引导方法中,添加:

use Illuminate\Support\Facades\Validator;

// ...

public function boot()
{
    Validator::extend('fqdn', 'App\Rules\FQDN@validate');
    Validator::replacer('fqdn', 'App\Rules\FQDN@replace');
}

Validator::extend()用于验证规则

Validator::replacer()用于显示错误消息

然后是5.4规则类:

<?php

namespace App\Rules;

class FQDN
{
    public function validate($attribute, $value, $parameters, $validator)
    {
        return preg_match('/^(?!:\/\/)(?=.{1,255}$)((.{1,63}\.){1,127}(?![0-9]*$)[a-z0-9-]+\.?)$/i', $value);
    }

    public function replace($message, $attribute, $rule, $parameters)
    {
        return str_replace(':fqdn', implode(', ', $parameters), $message);
    }
}

现在您可以使用以下验证:

$this->validate($request, [
    // other rules be here
    'fqdn' => [
        'required',
        'fqdn',
    ],
]);