どーも!marusukeです!
今回は、前回の続き(【Laminas】ServiceManagerを作る!)で、完成したModelを操るコントローラーを作成しましょう!
コントローラーにコンストラクターを作成する
以前の記事(【Laminas】コントローラーとビュースクリプトを作る!)で作成した、コントローラーにコンストラクターを追記していきます。
コントローラーの場所は、module/Album/src/Controller/AlbumController.phpでしたね!
追記内容は、
namespace Album\Controller;
// 下の1行を追加です。
use Album\Model\AlbumTable;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
class AlbumController extends AbstractActionController
{
// この1行も追加です。
private $table;
// コンストラクタも追加です。
public function __construct(AlbumTable $table)
{
$this->table = $table;
}
//public function indexAction()以下は、省略します。
}
AlbumTableクラスをコンストラクタインジェクションできましたね!
次は、このコントローラーをAlbumTableクラスと同様に、インスタンス化させるためにModule.phpに記述していきます。
コントローラーをServiceManagerに知らせる
コントローラーは、AlbumTableクラスをDIすることになったため、新しくなったコントローラーをServiceManagerに知らせる必要が出てきました!
①Module.php内に追記と
②module.congfig.phpに現在のコントローラーについての記述の削除をします。
まず、①Module.phpへの追記です。
namespace Album;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Db\ResultSet\ResultSet;
use Laminas\Db\TableGateway\TableGateway;
use Laminas\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface
{
// getConfig() は getServiceConfig() 割愛します。
// ここにgetControllerConfig()を記述します。
public function getControllerConfig()
{
return [
'factories' => [
Controller\AlbumController::class => function($container) {
return new Controller\AlbumController(
$container->get(Model\AlbumTable::class)
);
},
],
];
}
}
今回は、コントローラーなので、「getControllerConfig()メソッド」で記述します。
メソッドのクロージャ部分を簡単に説明すると、
$containerからAlbumTableオブジェクトを取得し、AlbumControllerインスタンスの引数としてAlbumTableオブジェクトを渡しています。
②module.congfig.phpに現在のコントローラーについての記述の削除をします。
まず、削除するものを確認しましょう!
場所は、module/Album/config/module.config.phpです。
namespace Album;
// この行だけを削除してください。
use Laminas\ServiceManager\Factory\InvokableFactory;
return [
// この'controllers'の配列を削除してください。
'controllers' => [
'factories' => [
Controller\AlbumController::class => InvokableFactory::class,
],
],
//'router' = [];と
//'view_manager' = [];の記述は残しておきます。
];
削除する理由は、①Module.php内に追記したためです。
具体的に説明すると、今回書き換えたAlbumControllerにAlbumTableオブジェクトをコンストラクタとして渡す必要があり、SeviceManegerに知らせる内容が変わっているためです。
ちなみにこの「InvokableFactory::class」とは、依存関係のないインスタンス化、オブジェクトの呼び出しの際に使われるものです。
ここまでで、Modelを操るコントローラーを作成することができました!
お疲れ様でした!
次に、Albumの一覧をブラウザに表示するため、Viewを作成していきます!
コメント