【Laminas】Modelを操るコントローラーを作成する!

Laminas

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

コメント

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