ZF2 ActiveRecordモジュール

みなさんこんにちは。



最近、私は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. 関係管理(1対1、1対多、多対多)
  3. 検出されたエラーの修正




参照資料


https://github.com/alxsad/zf2activerecord

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



ご清聴ありがとうございました。



All Articles