FuelPHP의 ORM Observer는 매우 편리합니다.
ORM Observer
FuelPHP의 ORM 패키지에 포함된 옵저버가 매우 편리합니다.
이벤트 기반이므로 특정 이벤트 발생시 처리를 수행 할 수 있습니다.
예를 들어, before_insert, before_save, after_load 등의 타이밍.
표준으로 몇몇 옵저버가 부속되어 있어, 스스로 만들 수도 있다.
부속 옵저버
시도해보기
테스트 데이터
우선 설명용으로 MySQL에 적당한 테이블을 추가해 테스트 데이터를 투입.
CREATE TABLE `students` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`blood_type` varchar(10) DEFAULT '',
`favorite_things` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Model_Student 만들기
이러한 느낌으로, 컬럼명이나 논리 삭제 플래그, 주요한 4개의 옵저버를 설정.
student.php
class Model_Student extends Orm\Model_Soft
{
protected static $_primary_key = array('id');
protected static $_soft_delete = array(
'mysql_timestamp' => true,
);
protected static $_properties = array(
'id',
'blood_type' => array(
'data_type' => 'var_char',
'validation' => array(
'match_pattern' => array('@\A(A|B|O|AB)\z@'),
),
),
'name' => array(
'data_type' => 'varchar',
),
'favorite_things' => array(
'data_type' => 'json',
),
'created_at' => array(
'data_type' => 'time_mysql',
),
'updated_at' => array(
'data_type' => 'time_mysql',
),
'deleted_at' => array(
'data_type' => 'time_mysql',
)
);
protected static $_observers = array(
'Orm\Observer_Typing' => array(
'events' => array('before_save', 'after_save', 'after_load')
),
'Orm\Observer_Validation' => array(
'events' => array('before_insert', 'before_save'),
),
'Orm\Observer_UpdatedAt' => array(
'events' => array('before_save'),
'mysql_timestamp' => true,
),
'Orm\Observer_CreatedAt' => array(
'events' => array('before_insert'),
'mysql_timestamp' => true,
),
);
}
Typing에서 JSON도 디코딩
모델을 find해서 취득하는 것만으로, 이하와 같이 캐스트된다.
$student = \Model_Student::find(1);
/*
array (
'blood_type' => 'O',
'name' => 'Ichigo Hoshimiya',
'favorite_things' =>
stdClass::__set_state(array(
'color' => 'pink',
'genre' => 'cute',
'brand' => 'Angely Sugar',
)),
'created_at' =>
Fuel\Core\Date::__set_state(array(
'timestamp' => 1349659654,
'timezone' => 'Asia/Tokyo',
)),
'updated_at' =>
Fuel\Core\Date::__set_state(array(
'timestamp' => 1401273534,
'timezone' => 'Asia/Tokyo',
)),
'deleted_at' => NULL,
'id' => '1',
)
*/
여기에는 없지만, int형이나 float형도, 물론 캐스트된다.
tinyint(1)의 컬럼에 data_type으로 bool을 설정해 두면 true/false가 되거나. 매우 편리.
Validation에서 유효성 검사
$student = \Model_Student::find(1);
try
{
$student->blood_type = 'AC';
$student->save();
}
catch (\Orm\ValidationFailed $e)
{
echo $e->getMessage();
// The field blood_type must match the pattern @\A(A|B|O|AB)\z@.
}
blood_type에 'AC'를 넣어 save하려고 해도 match_pattern에서 'A, B, O, AB'중 하나에 제한되어 있으므로 에러가 된다.
CreatedAt, UpdatedAt
물론 update하고 save하면 updated_at가 갱신된다.
$student = \Model_Student::find(1);
$student->favorite_things->lucky_charm = 'おしゃもじ';
$student->save();
Typing 진짜 편리
JSON 외에도 serialize라든지 사용할 수 있으므로, 이런 경우라면 편리함이 굉장히 좋다.
세세한 부분에서 스키말없는 데이터를 취급하고 싶어질 때, 라라라 ~ 라는 느낌으로 작게 쓸 수있다.
Reference
이 문제에 관하여(FuelPHP의 ORM Observer는 매우 편리합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/moroya/items/80f1746909aaf2fc6867텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)