2014-04-20 48 views
0

这里是我的代码:正确实施多重验证

我想在ServiceProvider上实现它,但我没有任何运气。

//Contact.php 
class Contact extends \Eloquent { 
    protected $fillable = array('email', 'name', 'subject', 'msg'); 
    public static $rules = array(
        'email' => 'required|email', 
        'name' => 'required', 
        'subject' => 'required', 
        'msg'  => 'required' 
    ); 
    public static function validate($input) { 
      return Validator::make($input, static::$rules); 
    } 
} 

//Registration .php 
class Registration extends \Eloquent { 
    protected $fillable = array('name', 'address', 'birthdate', 'gender', 'civil_status', 'nationality', 'contact_number', 'email', 'invited'); 
    protected $guarded = array('id'); 

    public static $rules = array(
      "name"   => "required|alpha_spaces", 
      "address"  => "required", 
      "contact_number" => "required|numeric", 
      "email"   => "required|email|unique:registrations" 
    ); 
    public static function validate($input) { 
      return Validator::make($input, static::$rules); 
    } 
} 

class HomeController extends BaseController 
{ 
    public function postContactForm() 
    { 
     return Contact::validate(Input::all()); 
    } 

    public function postRegistrationForm() 
    { 
     return Registration ::validate(Input::all()); 
    } 

} 

是否可以像这样实现它的一种方式?

$this->validate-check(Input::all()); 

我试图重构我的代码,也仍然使用laravel 4以及新的。

感谢,

回答

0

Aldren,

我认为,服务提供商是这个任务有点大材小用。您可以创建类似验证服务的东西。让我解释一下:

假设你把你的自定义文件放在app/src下,并使用composer自动加载那里的类。

创建一个摘要Validator类。这种方式可以扩展该类每一个你需要验证模型:

<?php namespace Foo\Services\Validation; 

abstract class Validator { 

protected $errors; 

public function check($validator) 
{ 
    if ($validator->fails()) { 
     $this->errors = $validator->messages(); 
     return false; 
    } 
    return true; 
} 

public function isValidForCreation($input) 
{ 
    $validator = \Validator::make($input, static::$insertRules); 
    return $this->check($validator); 
} 

public function isValidForUpdate($input) 
{ 
    $validator = \Validator::make($input, static::$updateRules); 
    return $this->check($validator); 
} 

public function errors() 
{ 
    return $this->errors; 
} 

} 

现在,让我们说你要验证Contact模型的输入,对不对?然后,您可以创建一个ContactValidator类,它扩展了我们Validator抽象类:

<?php namespace Foo\Services\Validation; 

class ContactValidator extends Validator 
{ 
static $insertRules = [ 
    'name' => 'required' 
]; 

static $updateRules = [ 
    'name' => 'required' 
]; 
} 

好了,所以现在我们有我们的样板进行。现在让我们去ContactsController实施我们的新ContactValidator

首先,我们需要在控制器内注入我们的验证器。恕我直言,最好的办法是在控制器构造函数中。

所以,让我们去:

<?php 

use Foo\Services\Validation\ContactValidator as Validator; 

class ContactsController extends \BaseController { 

protected $validator; 

function __construct(Validator $validator) 
{ 
    $this->validator = $validator; 
} 

太好了!现在我们注入了它。接下来,我们必须确保在尝试存储Contact时调用我们的ContactValidator。可以说你的方法被称为store()

public function store() 
{ 

     if(!$this->validator->isValidForCreation(Input::all())) 
     { 
      return Redirect::back()->withErrors($this->validator->errors())->withInput(); 
     } 
     else 
     { 
      //store your data here. 
     } 
} 

您可以使用$this->validator->isValidForCreation$this->validator->isValidForUpdate来检查你对验证服务的输入。

我希望你能理解一切,如果你有任何疑问,请告诉我。

欢呼和良好的编码:d

+0

'$ errors'应的'照亮\支持\ MessageBag'一个实例,并从所述验证的所有消息,然后应被添加'$袋式>添加('key','message')'。 – Marwelln

+0

@Marwelln这已经是真的了,因为'$ validator-> messages()'根据'http:// laravel.com/api/class-Illuminate.Validation.Validator.html'返回'Illuminate \ Support \ MessageBag' –

+0

感谢您输入GustavoR,我在这里得到您想要解释的内容。但是如何在一个控制器中实现$ this-> validator? '' –

0

感谢输入GustavoR,我给你想在这里解释一下。但是是否可以在一个控制器中实现$this->validator

use Foo\Services\Validation\MainValidator as Validator; 

class HomeController extends BaseController 
{ 

    protected $validator; 

    public function __construct(Validator $validator) 
    { 
     $this->validator = $validator; 
    } 

    public function postContactForm() 
    { 
     return ($this->validator->isValidForCreation(Input::all())); 

    } 

    public function postRegistrationForm() 
    { 
     return ($this->validator->isValidForCreation(Input::all())); 
    } 

} 

再次,由于对于输入:)