适当实施多重验证

时间:2014-04-20 17:11:28

标签: php design-patterns laravel

这是我的代码:

我正在尝试在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也是新的。

谢谢,

2 个答案:

答案 0 :(得分: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;
}

大!现在我们注入了它。接下来,我们必须确保在尝试存储ContactValidator时调用Contact。假设您的方法称为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来检查您对Validator服务的输入。

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

干杯和良好的编码:D

答案 1 :(得分: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()) );
    }

}

再次感谢输入:)