Laravel 4,使用extend添加自定义验证

时间:2014-06-06 17:51:23

标签: php laravel laravel-4

我正在尝试使用验证提供的Extend函数, 这就是我所拥有的:

1)。 HomeController.php:

  $rules = array(
                    'first_name'=>'required|regex:/^[a-z ,."-]+$/i|min:2',
                    'last_name'=>'required|regex:/^[a-z ,."-]+$/i|min:2',
                    'gender'=>'required|alpha|gendercheck',
                    'email'=>'required|email|unique:users,email,'.Input::get('id').',id',
                    'zip'=>'required|zipcheck|max:10',

                    );

2)。然后使用extend方法我将它添加到routes.php:

    Validator::extend('zipcheck', function($field,$value,$parameters){
    // List of regular expressions to use, if a custom one isn't specified.
    $countryRegs = array(
          "US"=>"/^[\d]{5}(-[\d]{4})?$/",
          "GB"=>"/^(GIR|[A-Z]\d[A-Z\d]??|[A-Z]{2}\d[A-Z\d]??)[ ]??(\d[A-Z]{2})$/",
          "DE"=>"/\b((?:0[1-46-9]\d{3})|(?:[1-357-9]\d{4})|(?:[4][0-24-9]\d{3})|(?:[6][013-9]\d{3}))\b/",
          "CA"=>"/^([ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZ]\d)$/",
          "FR"=>"/^(F-)?((2[A|B])|[0-9]{2})[0-9]{3}$/",
          "IT"=>"/^(V-|I-)?[0-9]{5}$/",
          "AU"=>"/^(0[289][0-9]{2})|([1345689][0-9]{3})|(2[0-8][0-9]{2})|(290[0-9])|(291[0-4])|(7[0-4][0-9]{2})|(7[8-9][0-9]{2})$/",
          "NL"=>"/^[1-9][0-9]{3}\s?([a-zA-Z]{2})?$/",
          "ES"=>"/^([1-9]{2}|[0-9][1-9]|[1-9][0-9])[0-9]{3}$/",
          "DK"=>"/^([D-d][K-k])?( |-)?[1-9]{1}[0-9]{3}$/",
          "SE"=>"/^(s-|S-){0,1}[0-9]{3}\s?[0-9]{2}$/",
          "BE"=>"/^[1-9]{1}[0-9]{3}$/"
    ); 

    // get country submitted..
    $country = Input::get('country');

    // check country if in the array..
    if (key_exists($country , $countryRegs))
        return preg_match($countryRegs[$country], $value);  
    else // other countries make sure no special characters in there
        return preg_match('/^[a-z0-9- ]+$/i' , $value);

    });

问题是我想保持我的代码有条理,我不想将验证扩展添加到我的routes.php

最好的方法是让我可以在自己的类中拥有这些并从我的HomeController调用它们仍然可以工作?

由于

2 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。我喜欢的方式是创建一个文件/app/validators.php(因此它与routes.php和filters.php位于同一位置)

然后转到app / start / global.php并在过滤器需要后在底部添加:

require app_path().'/validators.php';

您现在可以在validators.php文件中声明所有扩展验证器 - 并且Laravel将使用它们。

答案 1 :(得分:1)

有几种方法可以做。我个人喜欢通过ValidationService扩展验证(我认为它更清洁)。

1)我们假设您使用PSR-4在composer.json中加载您自己的公司目录:

{
    "autoload": {
        "psr-4": {
            "Acme\\": "app/Acme"
        }
        ...
    },
}

您必须运行composer dumpautoload

2)创建验证服务提供商:

应用程序/ Acme的/扩展/验证/ ValidationServiceProvider.php

<?php
namespace Acme\Extension\Validation;

use Illuminate\Support\ServiceProvider;

class ValidationServiceProvider extends ServiceProvider {

    public function register() {
    }

    public function boot() {
        $this->app->validator->resolver(function($translator, $data, $rules, $messages) {
            return new CustomValidator($translator, $data, $rules, $messages);
        });
    }

}

3)app/config/app.php注册您的服务提供商以进行自动加载:

<?php

return array(
    'providers' => array(
        ...
        'Acme\Extension\Validation\ValidationServiceProvider',
    ),
);

4)创建自定义验证规则:

应用程序/ Acme的/扩展/验证/ CustomValidator.php

<?php
namespace Acme\Extension\Validation;

use Illuminate\Validation\Validator as IlluminateValidator;

class CustomValidator extends IlluminateValidator {

    public function validateAlphaNumSpace($attribute, $value) {
        return preg_match('/^([a-z\x20])+$/i', $value);
    }

    public function validateZip($attribute, $value, $parameters) {
        ...
    }

}

5)您已准备好使用自定义规则。例如,如果我想使用我的AlphaNumSpace规则(在许多情况下很有用,因为原始的AlphaNum规则不允许空格!):

$rules = [
    'name'    => 'required|alpha_num_space',
    'zipcode' => 'required|zip',
];