どーも!marusukeです!
前回(【Laminas】add.phtmlを作る!)の続きで、今回は編集画面を作るため、AlbumController.phpのeditActionを追加していきます。次の回で、edit.phmtlを作成していく流れです。
では早速始めていきましょう!
editActionを追加する
AlbumController.phpに以下を追記します。場所は、module/Album/src/Controller/AlbumController.phpです。
//public function addAction()などの記述は、割愛します。
public function editAction()
{
//①
$id = (int) $this->params()->fromRoute('id', 0);
if (0 === $id) {
return $this->redirect()->toRoute('album', ['action' => 'add']);
}
try {
$album = $this->table->getAlbum($id);
} catch (\Exception $e) {
return $this->redirect()->toRoute('album', ['action' => 'index']);
}
//②
$form = new AlbumForm();
$form->bind($album);
$form->get('submit')->setAttribute('value', 'Edit');
//③
$request = $this->getRequest();
$viewData = ['id' => $id, 'form' => $form];
if (! $request->isPost()) {
return $viewData;
}
//④
$form->setInputFilter($album->getInputFilter());
$form->setData($request->getPost());
if (! $form->isValid()) {
return $viewData;
}
try {
$this->table->saveAlbum($album);
} catch (\Exception $e) {
}
//⑤
return $this->redirect()->toRoute('album', ['action' => 'index']);
}
内容を説明していきます!
//①について
$id = (int) $this->params()->fromRoute('id', 0);
if (0 === $id) {
return $this->redirect()->toRoute('album', ['action' => 'add']);
}
try {
$album = $this->table->getAlbum($id);
} catch (\Exception $e) {
return $this->redirect()->toRoute('album', ['action' => 'index']);
}
$id = (int) $this->params()->fromRoute(‘id’, 0)の部分は、ルートに一致したidを提供します。
例えば、ルートが/album/edit/1(/{controller}/{action}/{id})の場合、fromRoute(‘id’, 0)なので、/album/edit/1の値を返します。
もし、fromRoute(‘action’, 0)の場合は、”edit”を返します。(正確には”string(4) edit”)
if (0 === $id) {…}の部分で、idが0の時は/album/index、つまりmodule.config.phpのalbumルートのデフォルトであるalbumの一覧が表示される画面に戻ります。
try catch構文では、tryで$idのalbumデータをデータベースから取り出し、$albumに格納しています。
catchでは、デフォルトであるalbumの一覧が表示されるルートを指定しています。
//②について
$form = new AlbumForm();
$form->bind($album);
$form->get('submit')->setAttribute('value', 'Edit');
ここでは、AlbumFormオブジェクトにtry catch構文で取得したデータを割り当てています。bindメソッドは、割り当てられたデータがvalidationに違反していないかを確かめます。
get(‘submit’)->setAttribute(‘value’, ‘Edit’)の部分はsubmitボタンのvalue(表示名)をデフォルトで’Go’であるため、’Edit’に変更しています。
//③について
$request = $this->getRequest();
$viewData = ['id' => $id, 'form' => $form];
if (! $request->isPost()) {
return $viewData;
}
$requestでは、以前の記事(【Laminas】ControllerにaddActionメソッドを追加する!)でも出てきた通り、Httpリクエスト内容を取得し、
if (! $request->isPost()) {…}の部分でPost通信か判定しています。Postでない場合は、view scriptに$viewDataを返します。
//④について
$form->setInputFilter($album->getInputFilter());
$form->setData($request->getPost());
if (! $form->isValid()) {
return $viewData;
}
Post通信の時、$album->getInputFilter()の部分で、Albumオブジェクトから今回自作したinputFilterをgetInputFilterメソッドで取得し、
$form->setInputFilter(…)の部分で、先ほど取得した自作inputFilterをAlbumFormオブジェクトのsetInputFilterメソッド(このメソッド自体はextends元のFormオブジェクトのメソッド)でAlbumFormオブジェクトにセットしています。inputFilter型であるかどうかの判定もしています。
$form->setData($request->getPost())の部分で、$request->getPost()はhttpリクエストオブジェクトの中のpostParamsというパラメーターから入力フォームに入力されたデータ(artist, titleなど)を取得しています。
$form->setData(…)部分で入力されたデータ(artist, titleなど)をAlbumFormオブジェクトに入れています。
if (! $form->isValid()) {…}で$formのデータ(artist, titleなど)がvalidation違反していないかを判定しています。
//⑤について
return $this->redirect()->toRoute('album', ['action' => 'index']);
ここでルートをalbum/index(albumの一覧が表示されるデフォルトのページ)に指定します。
これでeditActionメソッドが完成しました!
Albumエンティティに追記する
Album.phpに少しだけ修正を加えます。
追記の内容です!
module/Album/src/Model/Album.php
//exchangeArrayメソッドは割愛します。
//exchangeArrayメソッドの下に書きます。
public function getArrayCopy()
{
return [
'id' => $this->id,
'artist' => $this->artist,
'title' => $this->title,
];
}
//setInputFilterメソッドやgetInputFilterメソッドも割愛します。
getArrayCopyメソッドは、id, artist, titleを配列化して返すメソッドですが、bindメソッド内で呼び出される、Laminas\Hydrator\ArraySerializableというハイドレーターオブジェクトが使用される時に使われます。
ArraySerializableオブジェクトの中で、Albumエンティティ内にgetArrayCopyメソッドがあることを確認し使用するので、getArrayCopyメソッドの記述が必要になります。
以上でeditActionが出来上がりました!お疲れ様でした!
次は、View scriptのedit.phtmlを作成します!
コメント