どーも!marusukeです!
前回の記事(【Laminas】ControllerとViewを準備する)の続きで、ブログモジュールのModelを作成してきましょう!
Modelは2つのクラスを作ります。
- リポジトリクラス(SQLでデータの出し入れをするクラス)
- エンティティクラス(データが入る箱のようなクラス)
早速作っていきます!
リポジトリクラスを作る
リポジトリファイルは、簡単に説明すると「SQLでデータの出し入れをするファイル」を指します。
具体的には、Albumモジュール(こちらの記事です)で作ったfetchAllメソッドやgetAlbumメソッド、saveAlbumメソッドになります。
また、リポジトリファイルは、インターフェースを作ることで、メソッド内部の記述方法を後から変えやすくすることがベストプラクティスとされています。
module/Blog/src/Model/PostRepositoryInterface.phpを以下のように記述します。
namespace Blog\Model;
interface PostRepositoryInterface
{
/**
* 反復処理可能な複数のブログ記事を返します。
*
* Each entry should be a Post instance.
*
* @return Post[]
*/
public function findAllPosts();
/**
* ブログ記事を1つ返します。
*
* @param int $id Identifier of the post to return.
* @return Post
*/
public function findPost($id);
}
findAllPostsメソッドは、継承先のクラスで、DBの全ての記事(Posts)を取得するSQLを書いていきます。
また、findPostメソッドは、継承先のクラスで、パラメーターで取得したidから一致する記事(Posts)を取得するSQLを書いていきます。
次に、このインターフェースを継承するリポジトリクラスを作成します。
ファイルの場所は、module/Blog/src/Model/PostRepository.phpです。
記述内容は以下です。
namespace Blog\Model;
class PostRepository implements PostRepositoryInterface
{
/**
* {@inheritDoc}
*/
public function findAllPosts()
{
// ここに全ての全ての記事を取得するメソッド内容を実装します
}
/**
* {@inheritDoc}
*/
public function findPost($id)
{
// ここにパラメーターと一致するidの記事を取得する内容を実装します。
}
}
postRepository.phpが出来ました!後ほど、メソッド内容を実装していきます。
エンティティクラスを作る
エンティティクラスは、データが入る箱のようなクラスです。以下のようになります。
module/Blog/src/Model/Post.php
namespace Blog\Model;
class Post
{
/**
* @var int
*/
private $id;
/**
* @var string
*/
private $text;
/**
* @var string
*/
private $title;
/**
* @param string $title
* @param string $text
* @param int|null $id
*/
public function __construct($title, $text, $id = null)
{
$this->title = $title;
$this->text = $text;
$this->id = $id;
}
/**
* @return int|null
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getText()
{
return $this->text;
}
/**
* @return string
*/
public function getTitle()
{
return $this->title;
}
}
これでエンティティクラスが出来ました。getterメソッドによって、必要に応じて各データを別のインスタンスに渡すことが出来ます。
リポジトリクラスのメソッドを実装する
今回のPostRepositoryクラスには、ダミーデータを記述し、そのダミーデータを扱うようにメソッドを記述していきます。
以下を実装します。
module/Blog/src/Model/PostRepository.php
namespace Blog\Model;
use DomainException;
class PostRepository implements PostRepositoryInterface
{
private $data = [
1 => [
'id' => 1,
'title' => 'Hello World #1',
'text' => 'This is our first blog post!',
],
2 => [
'id' => 2,
'title' => 'Hello World #2',
'text' => 'This is our second blog post!',
],
3 => [
'id' => 3,
'title' => 'Hello World #3',
'text' => 'This is our third blog post!',
],
4 => [
'id' => 4,
'title' => 'Hello World #4',
'text' => 'This is our fourth blog post!',
],
5 => [
'id' => 5,
'title' => 'Hello World #5',
'text' => 'This is our fifth blog post!',
],
];
/**
* {@inheritDoc}
*/
public function findAllPosts()
{
return array_map(function ($post) {
return new Post(
$post['title'],
$post['text'],
$post['id']
);
}, $this->data);
}
/**
* {@inheritDoc}
*/
public function findPost($id)
{
if (! isset($this->data[$id])) {
throw new DomainException(sprintf( 'id:"%s"の記事は見つかりませんでした。', $id));
}
return new Post(
$this->data[$id]['title'],
$this->data[$id]['text'],
$this->data[$id]['id']
);
}
}
findAllPostsメソッドとfindPostメソッドについて説明します。
findAllPostsメソッドは、php関数のarray_map関数を使い、Postクラスに全てのダミーデータを入力(マッピング)し、そのデータの入ったPostクラスを返しています。
findPostメソッドは、ダミーデータに$idと一致するデータがない場合の例外処理と、$idと一致するダミーデータがある場合、そのデータを返しています。
これでリポジトリクラスとエンティティクラスが完成しました。
お疲れ様でした!
次の記事でリポジトリクラスとエンティティクラスをコントローラーに取り込んでいきます!
コメント