ZF2 ActiveRecord Module

в 13:36, , рубрики: activerecord, module, Zend Framework, zf2, метки: , ,

Всем привет.

Сравнительно недавно начал изучать 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 Zf2ActiveRecordActiveRecord($adapter, array(
                    'primaryKey' => 'id',
                    'tableName'  => 'books',
                ));
                return $factory;
            },
        ),
    )

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books Zf2ActiveRecordActiveRecord */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book Zf2ActiveRecordActiveRecord */
        $book = $books->create(array(
            'title'  => 'test title',
            'author' => 'test author',
        ));
        $saved = $book->save();
    }
}
Пример использования с наследованием

namespace ApplicationEntity;
use Zf2ActiveRecordAbstractActiveRecord;

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 ApplicationEntityBook();
            $factory->setAdapter($adapter)
                    ->setPrimaryKey('id')
                    ->setTableName('books');
            return $factory;
        },
    ),
)

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books ApplicationEntityBook */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book ApplicationEntityBook */
        $book = $books->findByPk(1);
        $book->setTitle('Very Interested Book');
        $saved = $book->save();
    }
}
Пример удаления

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books ApplicationEntityBook */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book ApplicationEntityBook */
        $book = $books->findByPk(1);
        $deleted = $book->delete();
    }
}
Пример поиска

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        /* @var $books Zf2ActiveRecordActiveRecord */
        $books = $this->getServiceLocator()->get('books-active-record');
        return array(
            'books' => $books->find(function(ZendDbSqlSelect $select){
                $select->where(array('is_active' => 1));
                $select->limit(10);
            }),
        );
    }
}
Пример работы с событиями

namespace ApplicationController;
use ZendMvcControllerAbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction ()
    {
        $this->getEventManager()->getSharedManager()->attach(
            'ApplicationEntityBook', 'save.pre', function($e)
        {
            $book = $e->getTarget();
            if ($book->isNew()) {
                $book->setTitle($book->getTitle() . ' - new');
            }
        });
        /* @var $books ApplicationEntityBook */
        $books = $this->getServiceLocator()->get('books-active-record');
        /* @var $book Zf2ActiveRecordActiveRecord */
        $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

Спасибо за внимание

Автор: alxsad

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js