前回記事(【Laminas】データベースを作る)の続きです。
モデルを作りましょう!Laminasのモデルとはどんなものかを説明しながら進めていきます!
Laminasのモデルはどんなもの?
結論から先にお伝えすると、Laminas-modelコンポーネントは、ありません!
なので、書き方は自由です。(自由と言われても。。。)
とは言っても、よく使われる書き方があるのでそれを紹介します。
モデルの書き方
2つの手順があります。
①エンティティクラスを作る。
②オブジェクトマッパーを作る。(このコンポーネントはあります。)
①から説明していきます。
①エンティティクラスを作る。
①エンティティクラスを作る。
今回、データベースに保存されるデータは、
1, id(INTEGER PRIMARY KEY AUTOINCREMENT)
2, artist(varchar(100) NOT NULL)
3, title(varchar(100) NOT NULL)
の3つでしたね!
この3つを格納できるクラス(エンティティクラス)として、Album.phpにAlbumクラスを作っていきます。
記述内容はこれです。
Album.php(場所は、module/Album/src/Modelです。)
<?php
namespace Album\Model;
class Album
{
public $id;
public $artist;
public $title;
public function exchangeArray(array $data)
{
$this->id = !empty($data['id']) ? $data['id'] : null;
$this->artist = !empty($data['artist']) ? $data['artist'] : null;
$this->title = !empty($data['title']) ? $data['title'] : null;
}
}
簡単に内容を説明すると、
クラス名は、Album(ファイル名と同じにする。)
今回は、exchangeArray()メソッドを作ります。
exchangeArray()は、id、artist、titleの配列データを$this->id、$this->artist、$this->titleに格納するという作業をしています。
これで、エンティティクラスである、Album.phpが完成しました!
次は、②オブジェクトマッパーを作ります。
②オブジェクトマッパーを作る。
実際に作成するファイルはこちらです。
AlbumTable.php(場所は、module/Album/src/Modelです。)
<?php
namespace Album\Model;
use RuntimeException;
use Laminas\Db\TableGateway\TableGatewayInterface; //①
class AlbumTable
{
private $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) //②
{
$this->tableGateway = $tableGateway;
}
public function fetchAll() //③
{
return $this->tableGateway->select();
}
public function getAlbum($id) //④
{
$id = (int) $id;
$rowset = $this->tableGateway->select(['id' => $id]);
$row = $rowset->current();
if (! $row) {
throw new RuntimeException(sprintf(
'Could not find row with identifier %d',
$id
));
}
return $row;
}
public function saveAlbum(Album $album) //⑤
{
$data = [
'artist' => $album->artist,
'title' => $album->title,
];
$id = (int) $album->id;
if ($id === 0) {
$this->tableGateway->insert($data);
return;
}
try {
$this->getAlbum($id);
} catch (RuntimeException $e) {
throw new RuntimeException(sprintf(
'Cannot update album with identifier %d; does not exist',
$id
));
}
$this->tableGateway->update($data, ['id' => $id]);
}
public function deleteAlbum($id) //⑥
{
$this->tableGateway->delete(['id' => (int) $id]);
}
}
何やら多くのことが書かれていますね。。苦笑
ですが、実はシンプルなことが書いてあるだけです。結論から言うと、AlbumTableクラス内にCRUD操作のメソッドが書かれているだけです!
上から順に説明していきます!
//①use Laminas\Db\TableGateway\TableGatewayInterface; について
今回データベースからデータをCRUD操作するためのコンポーネントのメソッドです。
laminas-dbコンポーネントに含まれるTableGatewayInterfaceは、その名の通りテーブルゲートウェイデザインパターンを利用したインターフェイスです。(テーブルゲートウェイデザインとは?)
//②TableGatewayInterfaceをコンストラクタインジェクションしている。
これにより、CRUD操作をTableGatewayのメソッド呼び出すことによって実現しています。
//③ fetchAll()について
メソッド内を見てみると、
return $this->tableGateway->select();
となっており、tableGatewayのselect()メソッドを呼び出していますね!
select()メソッドはその名の通り、sql文でいう、select * from {今回のテーブル} です。
実は、select()だけでなく、insert()、update()、delete()もあります!これらを使ってCRUD操作の設定をしていきます。データベース操作が非常に簡単ですね!
LaminasDBコンポーネントのTableGatewayの公式ドキュメントは、こちらです!
//④getAlbum($id)メソッドについて
引数$idを受け取って、$idと一致する行を取得するということをしています。
$id = (int) $id;
$rowset = $this->tableGateway->select(['id' => $id]);
$row = $rowset->current();
この上記3行で、その処理を行っていますね!
select()は、select([‘id’ => $id])のような引数を取ると、「where id = %s」のような、where句が付く形になります。そのときの行を取得するためには、current()メソッドで呼び出すことが必要です。
if (! $row) {
throw new RuntimeException(sprintf(
'Could not find row with identifier %d',
$id
));
}
ここは、例外処理ですね!
//⑤ saveAlbum(Album $album)メソッドについて
メソッド名の通り、受け取ったデータを保存するメソッドです。
引数の型がAlbumクラスです。以前に作成したAlbum.phpを思い出すと、Album.phpはエンティティクラスでしたね!データの流れからイメージしやすいように伝えると、
Albumクラスの箱に$dataを入れる(Formの部分です。これから実装します。)
↓
Albumクラスの箱に入った$dataをsaveAlbum()メソッドが受け取る(Controllerが$dataを渡します。これから実装します。)
↓
saveAlbum()メソッドは$dataをDBに保存する。
saveAlbum()メソッドはこのような役割を担っています。
メソッドの中を詳しく見ていくと、
$data = [
'artist' => $album->artist,
'title' => $album->title,
];
$id = (int) $album->id;
$dataは、引数の$albumオブジェクトに格納されている‘artist’と‘title’を配列化しています。
$idは、$albumオブジェクトに格納されている’id’をintegerとして格納しています。
次に、
if ($id === 0) {
$this->tableGateway->insert($data);
return;
}
$idが0の時に、$dataをそのままデータベースにinsertする処理です。
そして、
try {
$this->getAlbum($id);
} catch (RuntimeException $e) {
throw new RuntimeException(sprintf(
'Cannot update album with identifier %d; does not exist',
$id
));
}
$this->tableGateway->update($data, ['id' => $id]);
上記は、$idが既にあるものの場合、$idのデータを今回新たに受け取った$dataに更新(update())をします。
ここまでが、//⑤ saveAlbum(Album $album)メソッドの処理ですね!
//⑥deleteAlbum($id)について
ようやくAlbumTableクラス最後のメソッドです。
引数$idを受け取って、その$idに当てはまるデータを削除します。
$this->tableGateway->delete(['id' => (int) $id]);
これで終了です!
長文お疲れ様でした!次からは、ServiceManagerを作っていきます!
コメント