Как стать автором
Поиск
Написать публикацию
Обновить

ZF2 ActiveRecord Module

Время на прочтение4 мин
Количество просмотров6.3K
Всем привет.

Сравнительно недавно начал изучать Zend Framework 2. Так как имею большой опыт работы с первой версией, решил заодно написать что-то полезное. Посмотрел modules.zendframework.com и решил — это будет Zf2ActiveRecord.

В статье я не буду описывать как делаются модули (есть много статей на эту тему), а просто приведу некоторые примеры работы с Zf2ActiveRecord. Предполагается что Вы уже умеете работать с Git и Composer. Если нет, то можно почитать это и это. Будет мало текста и много кода. Итак, поехали.



Установка

Пишем свой каркас или используем уже готовый ZendSkeletonApplication.

Добавляем зависимость в composer.json

"require": {
    "alxsad/zf2activerecord": "dev-master"
}

И включаем модуль в application.config.php

'modules' => array(
    'Application',
    'Zf2ActiveRecord',
),


Простой пример использования без наследования

'service_manager' => array(
        'factories' => array(
            'books-active-record' => function ($sm) {
                $adapter = $sm->get('zf2-active-record-adapter');
                $factory = new \Zf2ActiveRecord\ActiveRecord($adapter, array(
                    'primaryKey' => 'id',
                    'tableName'  => 'books',
                ));
                return $factory;
            },
        ),
    )

namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books \Zf2ActiveRecord\ActiveRecord */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book \Zf2ActiveRecord\ActiveRecord */
        $book = $books->create(array(
            'title'  => 'test title',
            'author' => 'test author',
        ));
        $saved = $book->save();
    }
}


Пример использования с наследованием

namespace Application\Entity;
use Zf2ActiveRecord\AbstractActiveRecord;

class Book extends AbstractActiveRecord
{
    /**
     * @var int
     */
    protected $id = null;

    /**
     * @var string
     */
    protected $author = null;

    /**
     * @var string
     */
    protected $title = null;

    /**
     * @return int
     */
    public function getId ()
    {
        return $this->id;
    }

    /**
     * @param int $id
     * @return Book
     */
    public function setId ($id)
    {
        $this->id = (int) $id;
        return $this;
    }

    /**
     * @return string
     */
    public function getAuthor ()
    {
        return $this->author;
    }

    /**
     * @param string $author
     * @return Book
     */
    public function setAuthor ($author)
    {
        $this->author = $author;
        return $this;
    }

    /**
     * @return string
     */
    public function getTitle ()
    {
        return $this->title;
    }

    /**
     * @param string $title
     * @return Book
     */
    public function setTitle ($title)
    {
        $this->title = $title;
        return $this;
    }

    /**
     * Exchange internal values from provided array
     *
     * @param  array $array
     * @return void
     */
    public function exchangeArray (array $array)
    {
        foreach ($array as $key => $value) {
            switch (strtolower($key)) {
                case 'id':
                    $this->setId($value);
                    continue;
                case 'author':
                    $this->setAuthor($value);
                    continue;
                case 'title':
                    $this->setTitle($value);
                    continue;
                default:
                    break;
            }
        }
    }

    /**
     * Return an array representation of the object
     *
     * @return array
     */
    public function getArrayCopy ()
    {
        return array(
            'id'     => $this->getId(),
            'author' => $this->getAuthor(),
            'title'  => $this->getTitle(),
        );
    }
}

'service_manager' => array(
    'factories' => array(
        'books-active-record' => function ($sm) {
            $adapter = $sm->get('zf2-active-record-adapter');
            $factory = new \Application\Entity\Book();
            $factory->setAdapter($adapter)
                    ->setPrimaryKey('id')
                    ->setTableName('books');
            return $factory;
        },
    ),
)

namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books \Application\Entity\Book */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book \Application\Entity\Book */
        $book = $books->findByPk(1);
        $book->setTitle('Very Interested Book');
        $saved = $book->save();
    }
}


Пример удаления

namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books \Application\Entity\Book */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book \Application\Entity\Book */
        $book = $books->findByPk(1);
        $deleted = $book->delete();
    }
}


Пример поиска

namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books \Zf2ActiveRecord\ActiveRecord */
        $books = $this->getServiceLocator()->get('books-active-record');
        return array(
            'books' => $books->find(function(\Zend\Db\Sql\Select $select){
                $select->where(array('is_active' => 1));
                $select->limit(10);
            }),
        );
    }
}


Пример работы с событиями

namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        $this->getEventManager()->getSharedManager()->attach(
            'Application\Entity\Book', 'save.pre', function($e)
        {
            $book = $e->getTarget();
            if ($book->isNew()) {
                $book->setTitle($book->getTitle() . ' - new');
            }
        });
        /* @var $books \Application\Entity\Book */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book \Zf2ActiveRecord\ActiveRecord */
        $book = $books->create(array(
            'title'  => 'test title',
            'author' => 'test author',
        ));
        $saved = $book->save();
    }
}


Доступные события

  1. find.pre
  2. find.post
  3. save.pre
  4. save.post
  5. delete.pre
  6. delete.post


Запланировано в новой версии

  1. Тесты PHPUnit
  2. Работа со связями (one-to-one, one-to-many, many-to-many)
  3. Исправление обнаружившихся ошибок


Ссылки

https://github.com/alxsad/zf2activerecord
https://packagist.org/packages/alxsad/zf2activerecord

Спасибо за внимание
Теги:
Хабы:
Всего голосов 7: ↑5 и ↓2+3
Комментарии16

Публикации

Ближайшие события