2013-07-30 3 views
2

테스트 가능한 Laravel 4 응용 프로그램을 작성하려고합니다. Layvel https://leanpub.com/laravel에 대한 Taylor Otwells의 저서에서 그는 Validation 네임 스페이스 내에서 UserValidator 클래스를 만들고 저장소에 해당 유효성 검사기를 삽입해야한다고 썼다. 컨트롤러, 저장소 및 테스트와 같은 코드 예제 코드를 제공해 주시겠습니까? 사용자 입력이 만족스럽지 않은 경우 저장소에 유효성 검사 예외를 던져 컨트롤러에서 오류를 catch해야합니까? http://jasonlewis.me/article/laravel-advanced-validationLaravel 4 리포지토리 확인 및 테스트

+1

마지막에 제공되는 [링크] (http://jasonlewis.me/article/laravel-advanced-validation)는 Laravel 4가 아닌 Laravel 3과 관련됩니다. –

답변

1

개인적으로 모델에서 직접 확인 을 선호합니다. 내 컨트롤러에서 다음

class User extends Eloquent 
{ 
    public function getValidator() 
    { 
     $params = array(
      'username' => $this->username, 
      'password' => $this->password, 
     ); 

     $rules = array(
      'username' => ['required', 'unique:users'], 
      'password' => ['required', 'min:6'], 
     ); 

     return Validator::make($params, $rules); 
    } 
} 

명령 또는 테스트 난 그냥 발리의 인스턴스가 해당 메소드를 호출 것하고 내가 필요로하는 메소드를 호출합니다 : 그것은 다음과 같이 나는 각 모델에 대한 getValidator() 방법을 것이다라고 이는 passes() 또는 fails() 일 수 있습니다.

다음은 컨트롤러에서 실제로 어떻게 사용하는지 보여줍니다.

class UserController extends BaseController 
{ 
    public function processCreateUser() 
    { 
     // Retrieve user input. 
     $user = new User(Input::all()); 

     // Validate input. 
     $validator = $user->getValidator(); 

     if ($validator->passes()) 
     { 
      // Hash the password. 
      $user->password = Hash::make($user->password); 

      // Save the new user. 
      $user->save(); 

      return Redirect::to('users') 
       ->with('success', 'User created!'); 
     } 

     return Redirect::route('users.create') 
      ->withInput() 
      ->with('error', 'Cannot create user, please double check the form.') 
      ->withErrors($validator); 
    } 
} 
+2

원래의 질문이 요구 한 것! – JasonMortonNZ

+0

@JasonMortonNZ, 나는 당신과 동의합니다. 그러나 OP가 제공 한 마지막 링크는 리포지토리를 사용하는 대신 model_에 직접 유효성 검사를 구현하는 방법에 대해 설명합니다. 그래서 나는 내 개인적인 경험에 대한이 대답의 기초가 OP에 흥미가있을 수 있다고 힘들다. –

3

나는 최근 laracasts (테일러 Otwell의 책을 참조) (http://laracasts.com)가 추천 한이 비슷한을 코딩. 활용 된 신청 구조를 따를 필요가 없음을 유의하십시오.

<?php namespace ACME\Services\Validation; 

use Validator as V; 

abstract class Validator { 

    protected $errormessages; 
    protected $rules; 

    public function validate($input, $rules) 
    { 

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

     if ($validator->fails()) { 

      $this->errormessages = $validator->messages(); 

      return false; 
     } 

     return true; 

    } 

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

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

아래의 예제 코드에서 설명하는 것처럼 다양한 유효성 검사 목적으로 확장해야하는 클래스입니다.

<?php namespace ACME\Services\Validation; 

use Auth; 

class UserValidator extends Validator { 

    protected $create_rules = [ 
     'firstname' => 'required|min:3|max:64|alpha-dash', 
     'lastname' => 'required|min:2|max:64|alpha-dash', 
     'account' => 'required|min:4|max:15|alpha_num', 
     'email' => 'required|between:3,254|email|unique:users', 
     'description' => 'max:500' 
    ]; 

    protected $edit_rules = [ 
     'firstname' => 'required|min:3|max:64|alpha-dash', 
     'lastname' => 'required|min:2|max:64|alpha-dash', 
     'description' => 'max:500' 
    ]; 

    protected $pass_edit_rules = [ 
     'oldpassword' => 'required', 
     'password' => 'required|min:5|confirmed', 
     'password_confirmation'=> 'required|min:5' 
    ]; 

    public function validateCreate($input) 
    { 


     return parent::validate($input, $this->create_rules); 
    } 

    public function validateEdit($input) 
    { 
     $newRules = $this->edit_rules; 

     if ($this->validatePasswordChanged($input)) 
      $newRules = array_merge($newRules, $this->pass_edit_rules); 

     return parent::validate($input, $newRules); 
    } 

    public function validatePasswordChanged($input) 
    { 
     return $input['password'] != '' || $input['oldpassword'] != '' || $input['password_confirmation'] != '' ? true : false; 
    } 

} 

$ this-> validate는 클래스 내에서 parent :: validate처럼 쉽게 사용할 수있었습니다.

laracast가 레슨을 제공하기 때문에 클래스 LessonValidator 클래스 Validater {extends을 포함하는 LessonValidator.php 파일에 다른 규칙 집합이 포함될 수 있습니다.

저장소 내에서 사용 하시겠습니까? 저장소 인터페이스와 서비스 제공자는

<?php namespace ACME\Repositories; 

use User; 
use UserController; 
use ACME\Services\Validation\UserValidator; 

class DatabaseUserRepository extendes UserRepositoryInterface { 
    protected $validator; 

    public function __construct(UserValidator $validator, UserController $listener) 
    { 
     $this->validator = $validator; 
     $this->listener = $listener; 
    } 

    public function createUser(User $user) 
    { 
     if ($this->validator->validateCreate($input)) 
      return $this->listener->withErrors('/',$this->validator->getErrorMessages()); 

     /* Validation passed, create user with User::create() */ 

     $this->listener->withView('usercreatedview'); 
    } 
} 

는 컨트롤러가 다음의 라인을 따라 뭔가를 포함하는 것 제외됩니다.

<?php 

use ACME\Repositories\UserRepositoryInterface; 

class UserController extends BaseController { 

    protected $repository; 

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

    public function withErrors($path, MessageBag $errors) 
    { 
     return Redirect::to($path)->withErrors($errors); 
    } 

    public function withView($view) 
    { 
     return View::make($view); 
    } 

    /* Other controller stuff... */ 
} 

당신이 UserRepositoryInterface (내가 만든 수있는 오타)에 DatabaseUserRepository를 결합하지 않는 경우이 오류가 밖으로 것이라는 점을 유의하시기 바랍니다. 유효성 검사 클래스를 컨트롤러에 삽입 할 수는 있지만 저장소를 통합하려고한다고 생각합니다. 이벤트 핸들러 내부에서 유효성 검사 및 저장소 호출을하는 경향이 있습니다.

필자는 psr 자동 로딩, 종속성 삽입 및 사용자 지정 서비스 공급자 만들기에 대해 읽어 보았습니다.

+1

컨트롤러는 리포지토리를 호출해야합니다. _Repository는 데이터 저장소에 유지 된 개체 집합과 그 위에 수행되는 작업을 캡슐화하여 지속성 계층에 대한보다 객체 지향적 인보기를 제공합니다. _ [Martin Fowler의 P of EAA Catalog] (http://martinfowler.com/eaaCatalog /repository.html) –

+0

리포지토리가 컨트롤러를 호출하지 않고 컨트롤러의 결과를 청취자에게 알리기 만하면됩니다. Matt Wynne은 Gotham Ruby Conference에서이를 시연했으며 Jeffrey Way는 "컨트롤러 정리"화면 캐스트에서 Laravel로 번역했습니다. –

+0

매트 윈 (Matt Wynne)이 단순히 "해야만하는"일을 따라 간다면 수동적 인 관제사 아이디어에 얽매이지 않을 것입니다. 참고 문헌 : http://vimeo.com/44807822 - https://laracasts.com/lessons/controller-cleanup –