【Laminas】editActionを追加する!

Laminas

どーも!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を作成します!

コメント

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