Всем привет.
Сравнительно недавно начал изучать 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();
}
}
Доступные события
- find.pre
- find.post
- save.pre
- save.post
- delete.pre
- delete.post
Запланировано в новой версии
- Тесты PHPUnit
- Работа со связями (one-to-one, one-to-many, many-to-many)
- Исправление обнаружившихся ошибок
Ссылки
https://github.com/alxsad/zf2activerecord
https://packagist.org/packages/alxsad/zf2activerecord
Спасибо за внимание
Автор: alxsad