DomainInfoRequest.php 2.9 KB
<?php

namespace App\Http\Requests\Aside\Domain;

use App\Models\Aside\Domain\DomainInfo;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

class DomainInfoRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        Validator::extend('validate_domain', function ($attribute, $value, $parameters, $validator) {
            return $this->validateDomain($value);
        });
        $domain          = new DomainInfo();
        $status_tot_keys = array_keys($domain->StatusToArray());
        $belong_to_keys  = array_keys($domain->BelongToArray());
        # 编辑时不需要验证必填
        $required = 'required';
        if ($this->getRequestUri() != '/a/domain/add') {
            $required = '';
        }
        return [
            'domain'    => $required . '|max:200|validate_domain',
            'belong_to' => [
                $required,
                Rule::in($belong_to_keys)
            ],
            'status'    => [
                $required,
                Rule::in($status_tot_keys)
            ]
        ];
    }

    /**
     * 验证给定的值是否是有效的域名。
     *
     * @param mixed $value
     * @return bool
     */
    public function validateDomain($value)
    {
        // 从域中删除任何空间或路径。
        $domain = preg_replace('/\s|\/.*$/', '', $value);
        // 验证域是否至少包含一个句点。
        if (strpos($domain, '.') === false) {
            return false;
        }
        // 验证域是否以句点开始或结束。
        if (strpos($domain, '.') === 0 || strrpos($domain, '.') === strlen($domain) - 1) {
            return false;
        }
        // 验证域是否不包含无效字符。
        if (!preg_match('/^[a-zA-Z0-9\-\.]+$/', $domain)) {
            return false;
        }
        // 验证域是否具有有效的顶级域。
        $tld = substr($domain, strrpos($domain, '.') + 1);
        if (!in_array($tld, ['com', 'net', 'org'])) { // 如有必要,添加更多TLD。
            return false;
        }
        return true;
    }

    public function messages()
    {
        return [
            'domain.required'        => '域名不能为空',
            'domain.max'             => '域名长度不能超过200个字符',
            'domain.validate_domain' => '域名格式不正确',
            'belong_to.required'     => '域名所属不能为空',
            'belong_to.in'           => '域名所属参数错误',
            'status.required'        => '域名状态不能为空',
            'status.in'              => '域名状态参数错误',
        ];
    }

}