테스트 가능한 Laravel 4 응용 프로그램을 작성하려고합니다. Layvel https://leanpub.com/laravel에 대한 Taylor Otwells의 저서에서 그는 Validation 네임 스페이스 내에서 UserValidator 클래스를 만들고 저장소에 해당 유효성 검사기를 삽입해야한다고 썼다. 컨트롤러, 저장소 및 테스트와 같은 코드 예제 코드를 제공해 주시겠습니까? 사용자 입력이 만족스럽지 않은 경우 저장소에 유효성 검사 예외를 던져 컨트롤러에서 오류를 catch해야합니까? http://jasonlewis.me/article/laravel-advanced-validationLaravel 4 리포지토리 확인 및 테스트
답변
개인적으로 모델에서 직접 확인 을 선호합니다. 내 컨트롤러에서 다음
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);
}
}
원래의 질문이 요구 한 것! – JasonMortonNZ
@JasonMortonNZ, 나는 당신과 동의합니다. 그러나 OP가 제공 한 마지막 링크는 리포지토리를 사용하는 대신 model_에 직접 유효성 검사를 구현하는 방법에 대해 설명합니다. 그래서 나는 내 개인적인 경험에 대한이 대답의 기초가 OP에 흥미가있을 수 있다고 힘들다. –
나는 최근 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 자동 로딩, 종속성 삽입 및 사용자 지정 서비스 공급자 만들기에 대해 읽어 보았습니다.
컨트롤러는 리포지토리를 호출해야합니다. _Repository는 데이터 저장소에 유지 된 개체 집합과 그 위에 수행되는 작업을 캡슐화하여 지속성 계층에 대한보다 객체 지향적 인보기를 제공합니다. _ [Martin Fowler의 P of EAA Catalog] (http://martinfowler.com/eaaCatalog /repository.html) –
리포지토리가 컨트롤러를 호출하지 않고 컨트롤러의 결과를 청취자에게 알리기 만하면됩니다. Matt Wynne은 Gotham Ruby Conference에서이를 시연했으며 Jeffrey Way는 "컨트롤러 정리"화면 캐스트에서 Laravel로 번역했습니다. –
매트 윈 (Matt Wynne)이 단순히 "해야만하는"일을 따라 간다면 수동적 인 관제사 아이디어에 얽매이지 않을 것입니다. 참고 문헌 : http://vimeo.com/44807822 - https://laracasts.com/lessons/controller-cleanup –
- 1. Laravel 4 리포지토리 및 자체 리포지토리 작업
- 2. Laravel 4 - 단위 테스트
- 3. 다른 리포지토리 내의 Laravel 리포지토리
- 4. 사용자가 로그인했는지 확인 laravel 4
- 5. Laravel 4 및 Symlinks
- 6. 로컬 호스트에서 Facebook 인증 테스트 (Laravel 4)
- 7. Entity Framework 4 리포지토리?
- 8. EF4 "코드 우선"및 리포지토리 단위 테스트
- 9. Laravel 4 : 확인 이메일을 보내는 방법?
- 10. Laravel 4 검색 기능 유효성 확인
- 11. Laravel 4 - 데이터베이스 값이 true인지 확인
- 12. Laravel 4 : 등록 중에 이메일이 진짜인지 확인
- 13. Laravel 4 간단한 폼 유효성 확인
- 14. Entity Framework 4 및 리포지토리 패턴
- 15. 실제 리포지토리 테스트
- 16. 통합 테스트 리포지토리 클래스
- 17. 스프링 리포지토리 테스트
- 18. Laravel 4
- 19. Laravel 4 :
- 20. Laravel 4 관계 및 이벤트
- 21. Laravel 4 및 Bootstrap Switch
- 22. Neo4J 및 Laravel 4 모델
- 23. Laravel 4 및 AngularJS Templates
- 24. Laravel 4 및 폴더 구조
- 25. Laravel 4 속성
- 26. 기능 테스트 및 확인
- 27. Laravel 4 :
- 28. Laravel 4 -
- 29. Laravel 4
- 30. Laravel 4 : ... 서비스 제공자
마지막에 제공되는 [링크] (http://jasonlewis.me/article/laravel-advanced-validation)는 Laravel 4가 아닌 Laravel 3과 관련됩니다. –