简体   繁体   English

Zend Framework 2(zf2)中TableGateway的预功能

[英]Pre functions for TableGateway in zend framework 2 (zf2)

I am using table gateway in zf2. 我在zf2中使用表网关。 This is simple model table with following working functions. 这是具有以下工作功能的简单模型表。 I can insert or update records but I need to know how can we define functions like beforeInsert or beforeUpdate like we do in doctrine(beforePersist). 我可以插入或更新记录,但是我需要知道如何像在doctrine(beforePersist)中那样定义像beforeInsert或beforeUpdate这样的函数。

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);
}

A simple and flexible solution would be to use an event manager instance into your table mapper and trigger the events in the correct place. 一个简单而灵活的解决方案是在表映射器中使用事件管理器实例,并在正确的位置触发事件。

I'll expand on the Event Manager's quick start example ; 我将在事件管理器的快速入门示例中进行扩展; ideally allot of this bloat could be abstracted out in an abstract class. 理想情况下,可以在抽象类中抽象出此膨胀的分配。

<?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 **/
    }
}

instantiate a TableGateway 实例化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'));

this is the MemberListener 这是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]);
            }
        }
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM