【Laminas】モデルを作る!

Laminas

前回記事(【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を作っていきます!

コメント

タイトルとURLをコピーしました