Laravel Framework 5의 Eloquent ORM을 위한 자체 검증 스마트 모델입니다.
Colby Rabideau의 Laravel 3용 Aware 번들을 기반으로 합니다.
저작권 (C) 2013-2015 Max Ehsan & Igor Santos
릴리스 목록을 방문하세요. 변경 로그가 거기에 작성되었습니다 :)
laravelbook/ardent
composer.json
의 요구 사항으로 추가하세요(배지에서 최신 안정 버전을 확인하세요!):
{"require": {"laravelbook/ardent": "3.*"}}
composer update
로 패키지를 업데이트하거나 composer install
로 설치하세요.
또한 composer require laravelbook/ardent
사용하고 나중에 원하는 버전을 지정하여 패키지를 추가할 수도 있습니다(현재로서는 dev-master
가장 좋습니다).
Ardent를 독립형 ORM 패키지로 사용하려는 경우 프로젝트의 부팅/시작 파일에서 다음 구성을 사용하여 수행하도록 초대됩니다(물론 데이터베이스에 따라 속성을 변경).
LaravelArdentArdentArdent::configureAsExternal(array( 'driver' => 'mysql', 'host' => 'localhost', 'port' => 3306, 'database' => 'my_system', 'username' => 'myself', 'password' => 'h4ckr', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci'), 'en'); //영어가 기본 메시지 언어이므로 비워둘 수 있습니다.
소개
시작하기
Ardent를 통한 간편한 검증
유효성 검사 오류 검색
유효성 검사 무시
사용자 정의 유효성 검사 오류 메시지
사용자 정의 검증 규칙
모델 후크
관계에 대한 더욱 명확한 정의
열렬한 개체를 자동으로 수분 공급
중복 양식 데이터 자동 삭제
보안 텍스트 속성을 자동으로 변환
고유한 규칙이 포함된 업데이트
빌드한 애플리케이션에서 동일한 상용구 코드를 얼마나 자주 다시 작성합니까? 이 일반적인 양식 처리 코드가 여러분에게 너무 친숙해 보입니까?
Route::post('register', function() {$rules = array('name' => 'required|between:3,80|alpha_dash','email' => 'required|between:5,64|email |unique:users','password' => '필수|최소:6|확인됨','password_confirmation' => 'required|min:6');$validator = Validator::make(Input::all(), $rules);if ($validator->passes()) { User::create(array('name' => 입력::get('name'),'email' => 입력::get('email'),'password' => Hash::make(Input:: get('비밀번호')) ));return Redirect::to('/')->with('message', '등록해 주셔서 감사합니다!'); } else {return Redirect::to('/')->withErrors($validator->getMessages()); } } );
이를 직접 구현하면 반복되는 상용구 코드가 많이 발생하는 경우가 많습니다. 추가 보너스로 컨트롤러(또는 경로 처리기)가 조기에 두꺼워지고 코드가 지저분하고 추악하며 이해하기 어려워집니다.
다른 사람이 당신을 위해 모든 무거운 짐을 졌다면 어떨까요? 위의 혼란스러운 내용을 반복하는 대신 입력해야 하는 것이 이 몇 줄뿐이라면 어떨까요?...
Route::post('register', function() {$user = new User;if ($user->save()) {return Redirect::to('/')->with('message', '감사합니다 등록을 위해!'); } else {return Redirect::to('/')->withErrors($user->errors()); } } );
열렬히 들어가세요!
Ardent - 모든 지루한 입력 삭제 상용구에 대한 마법 가루로 구동되는 손목 친화적인 원스톱 솔루션입니다!
말장난은 제쳐두고, 입력 유효성 검사 기능은 작성하고 유지하는 것이 금방 지루해질 수 있습니다. Ardent는 많은 반복 작업을 자동화하기 위한 도우미를 제공하여 이러한 복잡성을 해결합니다.
Ardent는 입력 검증에만 좋은 것은 아닙니다. Eloquent 데이터 모델 코드를 크게 줄이는 데 도움이 됩니다. Ardent는 여러 개별 애플리케이션에서 매우 유사한 코드를 반복해서 작성하는 데 지쳤을 때 특히 유용합니다.
예를 들어, 사용자 등록이나 블로그 게시물 제출은 한 애플리케이션에서 구현하고 다른 애플리케이션에서 다시 재사용할 수 있는 일반적인 코딩 요구 사항입니다. Ardent를 사용하면 자기 인식 스마트 모델을 한 번만 작성한 다음 다른 프로젝트에서 (수정 없이 또는 거의 수정하지 않고) 재사용할 수 있습니다. 이런 방식으로 일을 하는 데 익숙해지면 Ardent 없이 어떻게 대처했는지 솔직히 궁금해질 것입니다.
더 이상 반복적인 뇌 손상이 발생하지 않습니다!
Ardent
핵심 기능을 변경하지 않고 Eloquent
기본 클래스를 확장하는 것을 목표로 합니다. Ardent
자체는 IlluminateDatabaseEloquentModel
의 자손이므로 모든 Ardent
모델은 Eloquent
와 완벽하게 호환되며 Laravel의 멋진 OR/M의 모든 기능을 활용할 수 있습니다.
새로운 Ardent 모델을 생성하려면 모델 클래스가 Ardent
기본 클래스에서 파생되도록 만들기만 하면 됩니다. 다음 예제에서는 완전한 네임스페이스 클래스를 사용하여 예제를 더 깔끔하게 만들지만 모든 클래스에서 use
하는 것이 좋습니다.
LaravelArdentArdentArdent 사용; 클래스 사용자는 Ardent {}를 확장합니다.
참고: 일반 바닐라 Eloquent 모델과 Ardent 후손을 자유롭게 혼합 할 수 있습니다. 모델 객체가 사용자가 제출한 콘텐츠에 의존하지 않아 유효성 검사가 필요하지 않은 경우 Eloquent 모델 클래스를 그대로 둘 수 있습니다.
Ardent 모델은 Laravel의 내장 Validator 클래스를 사용합니다. 모델에 대한 유효성 검사 규칙을 정의하는 것은 간단하며 일반적으로 모델 클래스에서 정적 변수로 수행됩니다.
클래스 사용자 확장 LaravelArdentArdentArdent { public static $rules = array('name' => 'required|between:3,80|alpha_dash','email' => 'required|between:5,64|email|unique:users', 'password' => '필수|최소:6|확인됨','password_confirmation' => '필수|최소:6', ); }
참고 : 유효성 검사 규칙에도 배열 구문을 자유롭게 사용할 수 있습니다. 이전 Laravel 문서 링크에 신경쓰지 않기를 바랍니다. 그러나 Laravel 문서만큼 훌륭하지만 유효성 검사 규칙에 대한 파이프/배열 구문에 대한 명확한 참조는 불행히도 5.1 이후로 사라졌습니다.
Ardent 모델은 Ardent->save()
호출될 때 자동으로 유효성을 검사합니다.
$user = 새 사용자;$user->name = 'John doe';$user->email = '[email protected]';$user->password = 'test';$success = $user->save( ); // 모델이 유효하지 않으면 false를 반환합니다.
참고:
Ardent->validate()
메서드를 사용하여 언제든지 모델의 유효성을 검사할 수도 있습니다.
Ardent 모델이 검증에 실패하면 IlluminateSupportMessageBag
객체가 검증 실패 메시지를 포함하는 Ardent 객체에 첨부됩니다.
Ardent->errors()
메서드 또는 Ardent->validationErrors
속성을 사용하여 유효성 검사 오류 메시지 컬렉션 인스턴스를 검색합니다.
Ardent->errors()->all()
사용하여 모든 유효성 검사 오류를 검색합니다. Ardent->validationErrors->get('attribute')
사용하여 특정 속성에 대한 오류를 검색합니다.
참고: Ardent는 오류 형식 지정에 대한 간단하고 우아한 방법이 있는 Laravel의 MessagesBag 개체를 활용합니다.
Ardent의 유효성 검사를 재정의하는 방법에는 두 가지가 있습니다.
forceSave()
모델을 검증하지만 검증 오류가 있는지 여부에 관계없이 저장합니다.
Ardent->save($rules, $customMessages)
및 Ardent->validate($rules, $customMessages)
는 모두 두 개의 매개변수를 사용합니다.
$rules
Ardent::$rules
와 동일한 형식의 유효성 검사기 규칙 배열입니다.
$customMessages
매개변수도 마찬가지입니다( Ardent::$customMessages
와 동일).
비어 있지 않은 배열은 해당 메서드 인스턴스에 대해서만 클래스에서 지정한 규칙이나 사용자 정의 오류 메시지를 재정의합니다.
참고:
$rules
및$customMessages
의 기본값은 비어 있는array()
입니다. 따라서array()
전달하면 아무것도 재정의되지 않습니다.
Laravel Validator와 마찬가지로 Ardent를 사용하면 동일한 구문을 사용하여 사용자 정의 오류 메시지를 설정할 수 있습니다.
class User extends LaravelArdentArdentArdent { public static $customMessages = array('required' => ':attribute 필드는 필수입니다.', ... ); }
Laravel Validator에서와 동일한 방식으로 사용자 정의 유효성 검사 규칙을 만들 수 있습니다.
Ardent는 Eloquent의 모델 이벤트에 대해 전통적인 모델 후크와 같은 몇 가지 구문적 설탕을 제공합니다. 이는 모델 생활의 다양한 순간에 추가 작업을 연결하는 쉬운 방법입니다. 항목을 삭제하기 전 추가 정리 작업을 수행하거나, 유효성 검사가 발생한 후 자동 수정을 수행하거나, 업데이트가 발생한 후 관련 모델을 업데이트하는 데 사용할 수 있습니다.
모든 후크 before
false
(단순히 "falsy" 값이 아닌 부울)를 반환하면 작업이 중단됩니다. 따라서 예를 들어 beforeSave
메서드에 문제가 발생한 경우 저장을 중지하려면 return false
하면 저장이 발생하지 않으며 당연히 afterSave
도 호출되지 않습니다.
사용 가능한 후크의 전체 목록은 다음과 같습니다.
생성 before
/ afterCreate()
before
/ afterSave()
before
/ afterUpdate()
삭제 before
/ afterDelete()
before
/ afterValidate()
- false를 반환하면 유효성 검사가 중단되므로 유효성 검사가 실패했기 때문에 save()
작업도 실패하게 됩니다.
예를 들어 beforeSave
사용하여 사용자 비밀번호를 해시할 수 있습니다(실제로 자동 해싱을 사용하는 것이 더 좋습니다!).
class User extends LaravelArdentArdentArdent { public function beforeSave() {// 새 비밀번호가 있으면 해시 itif($this->isDirty('password')) { $this->password = Hash::make($this->password ); } true를 반환합니다. //또는 부울 false만 작업을 중지하므로 아무것도 반환하지 않습니다. } }
beforeSave
및 afterSave
런타임에 포함될 수 있습니다. save()
(또는 forceSave()
) 메서드에 대한 인수로 모델과 함께 클로저를 전달하기만 하면 됩니다.
$user->save(array(), array(), array(), function ($model) { // beforeSaveecho "모델 객체 저장 중..."에 대한 클로저;return true; }, function ($model) { // afterSaveecho "done!"에 대한 클로저; } );
참고: 클로저에는 저장되는 모델에 대한 참조가 전달되므로 하나의 매개변수가 있어야 합니다.
메소드 이름 자체와 거의 동일한 내용을 가진 한 줄짜리 클래스로 인해 클래스가 얼마나 복잡해졌는지 알아보기 위해 여러 관계가 포함된 Eloquent 모델을 작성한 적이 있습니까?
Ardent에서는 해당 정보가 포함된 배열의 관계를 명확하게 정의할 수 있으며 마치 메소드에서 정의한 것처럼 작동합니다. 예는 다음과 같습니다.
클래스 사용자 확장 LaravelArdentArdentArdent { public static $relationsData = array('address' => array(self::HAS_ONE, 'Address'),'orders' => array(self::HAS_MANY, 'Order'),'groups' = > array(self::BELOGS_TO_MANY, '그룹', '테이블' => 'groups_have_users') ); }$user = User::find($id);echo "{$user->address->street}, {$user->address->city} - {$user->address->state}";
배열 구문은 다음과 같습니다.
첫 번째 색인 값: hasOne
, hasMany
, belongsTo
, belongsToMany
, morphTo
, morphOne
, morphMany
또는 관련 상수(예: Ardent::HAS_MANY
또는 Ardent::MORPH_ONE
) 중 하나인 관계 이름.
두 번째 색인: 클래스 이름, 전체 네임스페이스 포함. 예외는 추가 인수를 취하지 않는 morphTo
관계입니다.
원래 Eloquent 메소드에 대해 정의된 인수를 따르는 명명된 인수:
foreignKey
[선택 사항], hasOne
, hasMany
, belongsTo
및 belongsToMany
에 유효함
table
, otherKey
[선택 사항], timestamps
[부울, 선택 사항] 및 pivotKeys
[배열, 선택 사항], belongsToMany
에 유효
morphTo
, morphOne
및 morphMany
에서 사용되는 name
, type
및 id
(마지막 두 개는 name
정의해야 함)
참고: 이 기능은 Yii 1.1 ActiveRecord의 쉬운 관계를 기반으로 했습니다.
Ardent는 양식 입력 제출에서 엔터티 모델 클래스를 자동으로 수화할 수 있습니다!
동작을 살펴보겠습니다. 다음 코드 조각을 고려해보세요.
$user = 새 사용자;$user->name = 입력::get('name');$user->email = 입력::get('email');$user->password = Hash::make(Input ::get('비밀번호'));$user->save();
Ardent의 Magick을 호출하고 이전 코드 조각을 다시 작성해 보겠습니다.
$user = 새로운 사용자;$user->save();
그게 다야! 우리가 한 일은 지루한 것들을 제거한 것뿐입니다.
믿거나 말거나, 위의 코드는 다소 장황하긴 하지만 기본적으로 이전 코드와 동일한 작업을 수행합니다. Ardent는 사용자가 제출한 양식 데이터의 속성으로 모델 객체를 채웁니다. 더 이상 채우는 것을 잊어버린 Eloquent 속성을 찾으려고 애쓰지 않아도 됩니다. Ardent가 지루한 일을 처리하고 재미있는 일을 계속하세요!
$fillable
/ $guarded
속성에 따라 내부적으로 동일한 대량 할당 규칙을 따릅니다.
자동 수화 기능을 활성화하려면 모델 클래스에서 $autoHydrateEntityFromInput
인스턴스 변수를 true
로 설정하기만 하면 됩니다. 그러나 기존 속성을 채우는 것을 방지하려면 업데이트 시나리오에서도 자동 하이드레이션을 원하는 경우 $forceEntityHydrationFromInput
대신 사용해야 합니다.
클래스 사용자 확장 LaravelArdentArdentArdent { public $autoHydrateEntityFromInput = true; // 새 항목의 유효성 검사를 수화합니다. 공개 $forceEntityHydrationFromInput = true; // 유효성 검사가 호출될 때마다 수화됩니다.}
Ardent 모델은 중복 입력 데이터(예: 비밀번호 확인 , 숨겨진 CSRF _token
또는 사용자 정의 HTTP _method
필드)를 자동으로 제거하여 추가 데이터가 데이터베이스에 저장되지 않도록 할 수 있습니다. Ardent는 확인 필드를 사용하여 양식 입력을 확인한 다음 모델 인스턴스를 데이터베이스에 저장하기 전에 이러한 속성을 신중하게 폐기합니다!
이 기능을 활성화하려면 모델 클래스에서 $autoPurgeRedundantAttributes
인스턴스 변수를 true
로 설정하면 됩니다.
클래스 사용자 확장 LaravelArdentArdentArdent { public $autoPurgeRedundantAttributes = true; }
추가 필드를 제거할 수도 있습니다. Ardent::$purgeFilters
속성은 사용자 정의 규칙을 추가할 수 있는 클로저 배열입니다. 이러한 클로저는 속성 키를 인수로 받고 제거해야 하는 속성에 대해 false
반환해야 합니다. 이와 같이:
function __construct($attributes = array()) { parent::__construct($attributes); $this->purgeFilters[] = function($key) {$purge = array('tempData', 'myAttribute');return ! in_array($key, $purge); }; }
모델 클래스에 password
라는 속성이 있지만 데이터베이스에 일반 텍스트 버전을 저장하고 싶지 않다고 가정해 보겠습니다. 실용적인 방법은 원본 콘텐츠의 해시를 저장하는 것입니다. 걱정하지 마세요. Ardent는 자동으로 보안 필드를 자동으로 변환할 수 있습니다!
그렇게 하려면 모델 클래스의 Ardent::$passwordAttributes
정적 배열 변수에 속성 이름을 추가하고 $autoHashPasswordAttributes
인스턴스 변수를 true
로 설정합니다.
클래스 사용자 확장 LaravelArdentArdentArdent { public static $passwordAttributes = array('password'); 공개 $autoHashPasswordAttributes = true; }
Ardent는 일반 텍스트 비밀번호 속성을 보안 해시 체크섬으로 자동 교체하고 이를 데이터베이스에 저장합니다. 내부적으로 Laravel Hash::make()
메소드를 사용하여 해시를 생성합니다. 참고: Eloquent의 $hidden
속성을 사용하는 것이 좋습니다. 그러면 API 또는 이와 유사한 것을 구축하는 경우 비밀번호가 해시되었더라도 쉽게 유출되지 않습니다. :)
Ardent 독립형을 사용하는 경우 Ardent::$hasher
사용하여 User::$hasher->check($given_password, $user->password)
와 같은 방법으로 필드 값을 확인할 수 있습니다.
Ardent는 고유한 업데이트를 통해 귀하를 도와드릴 수 있습니다. Laravel 문서에 따르면 고유한 규칙으로 필드를 업데이트(및 유효성 검사)할 때 업데이트 중인 레코드의 고유 ID를 전달해야 합니다. 이 ID를 전달하지 않으면 Laravel의 유효성 검사기가 이 레코드를 중복된 것으로 간주하므로 유효성 검사가 실패합니다.
Laravel 문서에서:
'이메일' => '고유:사용자,이메일,10'
과거에는 프로그래머가 ID 전달과 런타임 시 ID를 포함하도록 규칙 세트 변경을 수동으로 관리해야 했습니다. Ardent의 경우에는 그렇지 않습니다. 간단하게 unique
호출 함수 updateUniques
사용하여 규칙을 설정하면 Ardent가 나머지를 처리합니다.
확장 모델에서 규칙을 정의하세요.
public static $rules = array( 'email' => 'required|email|unique', 'password' => 'required|between:4,20|confirmed', 'password_confirmation' => 'between:4,20', );
컨트롤러에서 업데이트가 필요할 때 간단히 전화하세요.
$모델->updateUniques();
필요한 경우 런타임에 규칙을 updateUniques
에 전달할 수 있습니다. 그렇지 않으면 모델에서 제공하는 정적 규칙을 사용합니다.
위의 규칙 예에서는 Laravel 문서에 설명된 대로 어떤 테이블이나 어떤 필드를 사용할지 유효성 검사기에 알려주지 않았습니다(즉, unique:users,email,10
). Ardent는 그것을 알아낼 만큼 영리합니다. (github 사용자 @Sylph에게 감사드립니다)