2014-09-11 2 views
1

zf2에서 테이블 게이트웨이를 사용하고 있습니다. 이것은 다음과 같은 작동 기능을 갖춘 간단한 모델 테이블입니다. 레코드를 삽입하거나 업데이트 할 수 있지만 doctrine (beforePersist)에서와 같이 beforeInsert 또는 beforeUpdate와 같은 함수를 정의 할 수있는 방법을 알아야합니다.zend framework 2 (zf2)의 TableGateway에 대한 사전 함수

namespace Application\Model\AnyModel; 

use Zend\Db\TableGateway\TableGateway; 

class AnyModelTable { 

protected $tableGateway; 

public function __construct(TableGateway $tableGateway) { 
    $this->tableGateway = $tableGateway; 
} 

public function fetchAll() { 
    $resultSet = $this->tableGateway->select(); 
    return $resultSet; 
} 

public function getRecord($id) { 
    $id = (int) $id; 
    $rowSet = $this->tableGateway->select(array('id' => $id)); 
    $row = $rowSet->current(); 
    if (!$row) { 
     throw new \Exception("Could not found record with $id"); 
    } 
    return $row; 
} 

public function saveRecord(AnyModel $record) { 
    $data = array(
     'name' => $record->name, 
     'description' => $record->description, 
     'status' => $record->status, 
     'created_by' => $record->created_by, 
     'created_on' => $record->created_on, 
    ); 
    $id = (int) $record->id; 
    if ($id == 0) { 
     $this->tableGateway->insert($data); 
    } else { 
     if ($this->getUser($id)) { 
      $this->tableGateway->update($data, array('id' => $id)); 
     } else { 
      throw new \Exception("Could not update user with id $id"); 
     } 
    } 
} 

public function deleteRecord($id) { 
    $this->tableGateway->delete(array('id' => $id)); 
} 

public function getArrayCopy() { 
    return get_object_vars($this); 
} 

답변

2

간단하고 유연한 솔루션은 올바른 위치에 이벤트를 테이블 매퍼에 이벤트 관리 프로그램 인스턴스를 사용하여 트리거하는 것입니다.

Event Manager's quick start example으로 확장하겠습니다. 이상적으로이 부풀음은 추상 클래스에서 추상화 될 수 있습니다.

<?php 
use Zend\EventManager\EventManagerInterface; 
use Zend\EventManager\EventManager; 
use Zend\EventManager\EventManagerAwareInterface; 

class Foo implements EventManagerAwareInterface 
{ 
    const EVENT_INSERT_PRE = 'insert.pre'; 
    const EVENT_INSERT_POST = 'insert.post'; 
    const EVENT_INSERT_ERROR = 'insert.error'; 

    protected $events; 

    public function setEventManager(EventManagerInterface $events) 
    { 
     $events->setIdentifiers(array(
      __CLASS__, 
      get_called_class(), 
     )); 
     $this->events = $events; 

     $this->init($events); 

     return $this; 
    } 

    public function getEventManager() 
    { 
     if (null === $this->events) { 
      $this->setEventManager(new EventManager()); 
     } 
     return $this->events; 
    } 

    protected function init(EventManagerInterface $events) 
    { 
     $events->attach(
      static::EVENT_INSERT_PRE, // event that we listen to 
      array($this, 'onPreInsert') // The method that is triggered 
      100 // The priority 
     ); 
    } 

    public function save(AnyModel $record) 
    { 
     try { 
      $em = $this->getEventManager(); 

      $data = array('foo' => 'bar'); 

      $em->trigger(static::EVENT_INSERT_PRE, compact('record', 'data')); 
      //... 
      $this->tableGateway->insert($data); 
      //... 
      $em->trigger(static::EVENT_INSERT_POST, compact('record')); 

      return true; 
     } catch (\Exception $e) { 
      $em->trigger(static::EVENT_INSERT_ERROR, compact('e')); 

      return false; 
     } 
    } 

    public function onPreInsert(EventInterface $event) 
    { 
     $data = $events->getParam('data', false); 

     if ($data !== $someValidDataTypeOrValue) { 
      return; 
     } 
     /** do stuff **/ 
    } 
} 
0

인스턴스화 TableGateway

use use Zend\Db\TableGateway\Feature;  

/** @var \Zend\Db\TableGateway\TableGateway $memberTable */ 
$memberTable = TableFactory::get('member',new Feature\EventFeature()); 

/** @var \Zend\EventManager\ListenerAggregateInterface $eventService->getListener('Member') */ 
$eventService = $this->getServiceLocator()->get('Event'); 

$memberTable->getFeatureSet() 
      ->getFeatureByClassName('Zend\Db\TableGateway\Feature\EventFeature') 
      ->getEventManager() 
      ->attachAggregate($eventService->getListener('Member')); 

이것은 MemberListener

namespace Fselab\EventModel\Listeners; 

use Zend\EventManager\ListenerAggregateInterface; 
use Zend\EventManager\EventManagerInterface; 
use Zend\EventManager\EventInterface; 
use Zend\Db\TableGateway\Feature\EventFeature; 

class Member implements ListenerAggregateInterface 
{ 
    private $handle; 

    protected $listeners = array(); 

    function __construct() 
    { 

    } 

    public function attach(EventManagerInterface $events) 
    { 
      $this->listeners[] = $events->attach(EventFeature::EVENT_PRE_INSERT, function(EventInterface $e){ 
       $insert = $e->getParam('insert'); 

       return; 
      }, 100); 
    } 

    public function detach(EventManagerInterface $events) 
    { 
     foreach ($this->listeners as $index => $listener) { 
      if ($events->detach($listener)) { 
       unset($this->listeners[$index]); 
      } 
     } 
    } 

} 
이다