2014-06-06 35 views
0

我想使用自定义验证的扩展功能验证的报价, 这是我有:Laravel 4,添加使用扩展

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)。然后使用扩展方法我把它添加到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

有很多方法可以做到这一点。我喜欢的方式是使文件/app/validators.php(所以它是在同一位置routes.php文件和filters.php

然后进入应用程序/启动/ global.php并在底部添加这个过滤器需要后:

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

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

+0

知道这听起来好多了我感谢帮助 – user3150060

+0

这就是我在我的项目中做的。我有一个目录'app/extras',其中包含验证器,单例和过滤器等功能。 – Sam

1

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

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

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

你必须运行composer dumpautoload

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

应用程序/阿克米/分机/确认/ 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)创建自定义的验证规则(S):

应用程序/阿克米/分机/确认/ 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)您就可以使用您的自定义规则(S)。例如,如果我想使用我的AlphaNumSpace规则(在许多情况下很有用,因为原始AlphaNum规则不允许空间!):

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

我不能强调:**你必须运行'php artisan dump-autoload' **。 – bishop

+0

是的,这是最重要的!我忘了重新运行这个命令多少次了! – Guicara