どーも!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についてはこちらをご覧ください。
// ④-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とルートを作ります!
コメント