独学者Fossa

独学していることなど

CodeIgniter4 Modules

codeigniter.com

Modules

CodeIgniter 4で、modulesフォルダを設置する場合で、わかったことを書きます。

Info
自分自身の備忘録として、書いています。
まだ十分に把握してなかったり、勘違いしている部分もあるかもしれません。
ご了承ください。

使用環境

Name Version
PHP 7.4.18
CodeIgniter 4.1.2

フォルダ構造

/acme
    /Blog
        /Config
        /Controllers
        /Database
            /Migrations
            /Seeds
        /Helpers
        /Language
            /en
        /Libraries
        /Models
        /Views

上記のようなフォルダ構造を想定していますが、acmemodulesに置き換えています。

app/Config/Autoload.php

public $psr4 = [
    APP_NAMESPACE => APPPATH, // For custom namespace
    'Config'      => APPPATH . 'Config',
    'Acme'        => ROOTPATH . 'acme',
];

ドキュメントだと、上記ですが、実際は、下記のようにする必要があります。

public $psr4 = [
    APP_NAMESPACE  => APPPATH, // For custom app namespace
    'Config'       => APPPATH . 'Config',
    'Modules'      => ROOTPATH. 'modules',
    'Modules/Blog' => ROOTPATH. 'modules/Blog'
];

modules/Blog/Config/Routes.phpを読ませるためには、Modules(Acme)の行だけでなく、Modules/Blogの行も要ります。

modules/Blog/Config/Routes.php

<?php

namespace Modules\Blog\Config;

$routes->get('blog', 'Modules\Blog\Controllers\Blog::index');

app/Config/Routes.php

変更箇所は、2箇所です。

//$routes->setDefaultNamespace('App\Controllers');
$routes->get('/', 'App\Controllers\Home::index');

php spark routes

php spark routesをした結果が、下記の通りです。

+--------+----------------------------+------------------------------------------------+
| Method | Route                      | Handler                                        |
+--------+----------------------------+------------------------------------------------+
| GET    | /                          | \App\Controllers\Home::index                   |
| GET    | blog                       | \Modules\Blog\Controllers\Blog::index          |
| CLI    | migrations/([^/]+)/([^/]+) | \CodeIgniter\Commands\MigrationsCommand::$1/$2 |
| CLI    | migrations/([^/]+)         | \CodeIgniter\Commands\MigrationsCommand::$1    |
| CLI    | migrations                 | \CodeIgniter\Commands\MigrationsCommand::index |
| CLI    | ci(.*)                     | \CodeIgniter\CLI\CommandRunner::index/$1       |
+--------+----------------------------+------------------------------------------------+

試してダメだったこと

Laravel Modulesを思い出して、composer.jsonに、記述する方法を試してみました。

下記の通り、追記して、composer dump-autoloadをしましたが、ダメでした。

 "autoload": {
        "psr-4": {
            "App\\": "app",
            "Modules\\": "modules",
            "Config\\": "app/Config"
        },