控制器或路由过滤器上的验证服务 - Laravel

时间:2014-12-29 17:49:19

标签: php validation laravel filter controller

我有一个UsersController,通过服务Validator验证输入,如果验证失败,Validator会抛出ValidatorException。否则,Controller会创建用户。

我想知道在调用控制器之前将验证移动到路由过滤器是否更好,如果验证通过则请求可以继续并调用Controller的方法来创建用户。因此,如果控制器被称为“#34;输入有效,只需创建用户。

我在问这个问题,看看是否有可能和更好的方法来分离更多的逻辑和控制器负责一项工作(即使正在为服务进行验证,因此工作是分开的)。

我按照了这个http://jasonlewis.me/article/laravel-advanced-validation和这个http://www.slideshare.net/kirkbushell/comprehensive-validation-with-laravel-4教程

我的代码:

Route::resource('users', 'UsersController', array('except' => array('create', 'edit')));

class UsersController extends \BaseController {

    protected $user;
    protected $response;
    protected $hasher;
    protected $validator;

    public function __construct(User $user,
        Response $response,
        \Illuminate\Hashing\BcryptHasher $hasher,
        \Inc\Services\Validation\UserRegistrationValidator $validator){

        $this->user = $user;
        $this->response = $response;
        $this->hasher = $hasher;
        $this->validator = $validator;

    }


    public function index()
    {   

        return $this->user->all();

    }



    public function store()
    {
        $input = Input::json();

        $this->validator->with($input->all())->validate();

        $this->user->create([
            'username' => $input->get('username'),
            'password' => $this->hasher->make($input->get('password'))
        ]);

    }



    public function show($id)
    {
        return $this->user->find($id);
    }



    public function update($id)
    {
        //
    }



    public function destroy($id)
    {
        $user = $this->user->find($id);
        $user->delete();
    }


}

class UserRegistrationValidator extends Validation{

    protected $rules = [
        'username' =>['required', 'min:3', 'max:50'],
        'password' =>['required', 'min:3']

    ];

}

abstract class Validation{

    protected $rules = array();
    protected $messages = array();
    protected $input = array();

    public function with(array $input){

        $this->input = $input;

        return $this;

    }

    public function validate(){

        $this->validator = Validator::make($this->input, $this->rules, $this->messages);

        if($this->validator->fails())
            throw new ValidationException($this->validator);
    }

}

class ValidationException extends Exception {

    protected $validator;

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

    public function getErrors(){

        return $this->validator->messages();
    }
}

App::error(function(Inc\Exceptions\Validation\ValidationException $exception, $code)
{
    $errorResponse = [
        'error' => $exception->getErrors()
    ];

    return Response::json($errorResponse, $statusCode = 422);
});

0 个答案:

没有答案