独学者Fossa

独学していることなど

簡易モジュール構造

使用環境

Name Version
PHP 8.0.7
Laravel 8.49.0

Laravel Modulesを使うのであれば、今回の説明は、全く不要です。

簡易的に、Laravelにモジュール構造を構築したい場合、Service Providerを使うと思います。

composer.json

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/",
        "Modules\\": "Modules/",
    }
},

AdminServiceProvider.php

<?php

namespace  Modules\Admin\Providers;

use Illuminate\Support\ServiceProvider;

class AdminServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->mergeConfigFrom(__DIR__.'/../Config/courier.php', 'admin');
        $this->loadRoutesFrom(__DIR__.'/../Routes/web.php');
        $this->loadViewsFrom(__DIR__.'/../Resources/views', 'admin');
    }

モジュール構造の良いところは、必要なくなった場合、フォルダ毎、移動させればいい点です。

逆に書くと、必要な物は、モジュール内に全て、入っているので、管理しやすいです。

それと、Laravel / Laravelのインストールが一回で、済みます。

npm Workspacesと、Composer Merge Pluginを使うと、更に便利になると思います。*1

config/app.phpに記述する

config/app.phpに、記述するのが、確実で、一番とってり早い方法です。

LaravelPackage Auto Discoveryが、存在しなかった頃の方法ですね。

composer/installerを使う

github.com

いろんなCMSや、フレームワークに対応しています。

今回、モジュールをModulesフォルダにインストールしたい場合だと、typeasgard-moduleを使うのが、良いみたいです。

ルート側のcomposer.json

"extra": {
    "installer-paths": {
        "./Modules/{$name}": [
            "type:asgard-module"
        ]
    }
}

モジュール側のcomposer.json

{
    "name": "modules/admin",
    "type": "asgard-module",
    "description": "Admin Module",
    "authors": [
        {
            "name": "fossa",
            "email": "fossa.opll@gmail.com"
        }
    ],
    "require": {
        "php": "^7.3|^8.0",
    },
    "extra": {
        "laravel": {
            "providers": [
                "Modules\\Admin\\Providers\\AdminServiceProvider"
            ]
        }
    },
    "autoload": {
        "psr-4": {
            "Modules\\Admin\\": ""
        }
    },
    "minimum-stability": "dev"
}

インストール

composer require composer/installers

結果

Modules/Adminのように、モジュールのフォルダ名の頭文字を、大文字にしてくれます。

composer-custom-directory-installerを使う

github.com

上のプラグインと、似たようなプラグインだと思います。

モジュール側のcomposer.json

"extra": {
    "installer-paths": {
        "./Modules/{$name}": [
            "modules/admin"
        ]
    }
}

インストール

composer require mnsami/composer-custom-directory-installer

結果

Modules/adminとなり、モジュールのフォルダ名の頭文字を、大文字にしてくれません。

結論

今回の記事で、LaravelPackage Auto Discoveryについて、書きたかったのです。

モジュールのままだと、Composerのパッケージじゃないので、モジュール内にcomposer.jsonを設置して、extraを記述しても、Package Auto Discoveryは、機能しません。

試しに、wikimedia/composer-merge-pluginを使い、merge-extratrueにしましたが、もちろんダメです。

基本的には、vendor/composerフォルダ内にあるinstalled.jsonに、書き込まれる必要があります。

Composerのパッケージにすると、モジュール作る度に、パッケージとして追記したり、インストールする必要があります。

結局、config/app.phpに記述するのが、一番、楽かな?と、思いました。

モジュール構造について考えるのは、昔、CodeIgniter v2で、HMVCを使った名残みたいな感じだと思っていただけると、助かります。

参考リンク

*1:必須ではないです