FuelPHP의 ORM Observer는 매우 편리합니다.

12346 단어 FuelPHPPHP

ORM Observer



FuelPHP의 ORM 패키지에 포함된 옵저버가 매우 편리합니다.

이벤트 기반이므로 특정 이벤트 발생시 처리를 수행 할 수 있습니다.
예를 들어, before_insert, before_save, after_load 등의 타이밍.

표준으로 몇몇 옵저버가 부속되어 있어, 스스로 만들 수도 있다.

부속 옵저버


  • Observer_Self
  • 모든 이벤트가 발생하면 모델에 포함 된 모든 함수를 실행합니다.

  • Observer_CreatedAt
  • 레코드가 삽입 될 때 created_at 설정

  • Observer_UpdatedAt
  • 레코드가 업데이트 될 때 updated_at 설정

  • Observer_Validation
  • 레코드를 삽입하거나 업데이트하기 전에 열의 데이터 유효성 검사

  • Observer_Typing
  • 열 데이터 전송

  • Observer_Slug
  • URL 슬래그 생성


  • 시도해보기



    테스트 데이터



    우선 설명용으로 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라든지 사용할 수 있으므로, 이런 경우라면 편리함이 굉장히 좋다.
    세세한 부분에서 스키말없는 데이터를 취급하고 싶어질 때, 라라라 ~ 라는 느낌으로 작게 쓸 수있다.

    좋은 웹페이지 즐겨찾기