ZF2 ActiveRecord Module

от автора

Всем привет.

Сравнительно недавно начал изучать 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

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

ссылка на оригинал статьи http://habrahabr.ru/post/159941/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *