【Laminas】blog記事のためのコントローラーを作成する!

Laminas

どーも!marusukeです!

前回の記事で、blog記事を入力するためのFormクラスを作成しました。この記事では、その入力画面に関するコントローラー(WriteController)を作成していきます!

作成の流れとしては、

  • Formクラスを作成する。
  • コントローラーを作る。 <= 現在ここです!
  • コントローラーのインスタンス化のためのFactoryとルートを作る。
  • モデル(repositoryクラス)を作成する。
  • view側を作る。

WriteControllerを新たに作成する!

このコントローラーの役割は、

  • blog記事の追加(add)
  • blog記事の編集(edit)

の2つを持たせます。この記事では、WriteControllerにaddActionメソッドとeditActionメソッドの雛形だけを作ります。(各メソッドの処理内容はあとの記事で説明します。)

では、早速作りましょう!以下のようになります!

module/Blog/src/Controller/WriteController.php

<?php
// ①
namespace Blog\Controller;

// ②
use Blog\Form\PostForm;
use Blog\Model\Post;
use Blog\Model\PostCommandInterface;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;

// ③
class WriteController extends AbstractActionController
{
    // ④
    private $command;

    private $form;

    // ④-1
    public function __construct(PostCommandInterface $command, PostForm $form)
    {
        $this->command = $command;   
        $this->form = $form;
    }

    // ⑤
    public function addAction()
    {
    }

    // ⑥
    public function editAction()
    {
    }
}

簡単に上から説明していきます。

// ① 「namespace Blog\Controller;」について

namespaceにBlog\Controllerを指定しています。この空間にはWriteControllerはこのファイル一つだけが存在するということになります。簡単にいうとこのファイルのcomposerが呼び出す時の住所です。

// ② 「use Blog\Form\PostForm;…」について

use文で、この場所のファイルを読み込み、このファイル内で使えるようにしています。

// ③ 「class WriteController extends AbstractActionController…」について

WriteControllerというclassを定義しています。AbstractActionControllerクラスを継承しています。

// ④ 「private $command;…」について

このクラス内のプロパティを定義しています。privateなプロパティなので、WriteControllerのメソッドを呼び出して処理を実行させるときにしか、プロパティを使うことは出来ません。

PHPのプロパティのpublic, private, protectedについてはこちらをご覧ください。

PHPマニュアル アクセス権

// ④-1について

このコード部分を説明します。

public function __construct(PostCommandInterface $command, PostForm $form)
{
      $this->command = $command;   
      $this->form = $form;
}

コンストラクターを定義しています。

プロパティには、以下の2つで、データのオブジェクト型を指定されています。

  • $command (PostCommandInterfaceオブジェクト型)
  • $form (PostFormオブジェクト型)

なぜ、$commandは、PostCommandのInterfaceを型にしているのに、$formは、PostFormを型にしているかというと、

「Interfaceの型を指定すると、そのインターフェイスをimplementsしたクラスであれば、$commandの型のチェックは、クリアできる」ということです。

つまり、例としてPostCommandInterfaceをimplementsする、「NewPostCommandクラス」を新たに作ったとしても、このWriteControllerの$commandの型部分は、変更する必要がなく手間が省けるということです。

(ここで、もしコンストラクターの$commandの型チェックがPostCommandだった場合、NewPostCommandと書き換えなければなりません。これはとても手間です。)

// ⑤と// ⑥ 「public function addAction()」と「public function editAction()」について

addActionメソッドとeditActionメソッドを定義しています。publicなので、このメソッドを呼び出して処理を実行する制限はありません。

こちらも上記のと同じで「PHPマニュアル アクセス権」に記載があります。

これでWriteControllerの雛形ができました!

お疲れ様でした!

次は、コントローラーのインスタンス化のためのFactoryとルートを作ります!

コメント

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