独学者Fossa

独学していることなど

簡易Module構造 2024年版

Composer
Composer

参考にした記事

laravel-news.com

使用したバージョン

Name Version
PHP v8.3.3
Composer v2.7.1
Laravel v11.x

ファイル構造

.
├── app
├── app-modules
│   ├── teams
│   │   ├── composer.json
│   │   ├── database
│   │   ├── node_modules
│   │   ├── package.json
│   │   ├── pnpm-lock.yaml
│   │   ├── resources
│   │   ├── routes
│   │   ├── src
│   │   └── tests
│    --省略--
├── composer.json
│    --省略--

前書き

参考にした記事は、LaravelModuleを扱う方法について書いてあります。

動画を視聴して、internachi/modularを試してから、この記事を読んだ方が理解できるかもしれません。

ModuleCompsoer Local Packageとして、使います。

私も過去に色々試したのですが、その当時は、ベストな方法が見つかりませんでした。

nwidart/laravel-modulesや、internachi/modularを使うと、Laravelがバージョンアップした時に、すぐ追従してくれないと困る場合があります。

だから、nwidart/laravel-modulesinternachi/modularを使わない方法を模索しました。

今回も、nwidart/laravel-modulesinternachi/modularは使いません。

本題

PHPComposerのバージョンが上がっているので、過去の記事は忘れてください。

ディレクトリ作成

Laravelのルートディレクトリに、app-modulesというディレクトリを作成します。*1

app-modules配下に、teamsというディレクトリを作成します。

composer.json

Laravelのルートディレクトリにあるcomposer.jsonを変更します。

composer config repositories.0 '{"type": "path", "url": "app-modules/*", "options": {"symlink": true}}'

上記を実行すると、下記のように、repositories欄が追加されます。

    "require": {
        "php": "^8.2",
        "laravel/framework": "^11.0",
        "laravel/tinker": "^2.9"
    },
    --省略--
    "repositories": [
        {
            "type": "path",
            "url": "app-modules/*",
            "options": {
                "symlink": true
            }
        }
    ]

追記したい場合

    "repositories": [
        {
            "type": "path",
            "url": "../packages/hoge/*",
            "options": {
                "symlink": true
            }
        }
    ]

上記のように、既にローカルパッケージを使っていて、追記したい場合は下記の通り。

composer config repositories.1 '{"type": "path", "url": "app-modules/*", "options": {"symlink": true}}' --append
    "repositories": [
        {
            "type": "path",
            "url": "../packages/hoge/*",
            "options": {
                "symlink": true
            }
        },
        {
            "type": "path",
            "url": "app-modules/*",
            "options": {
                "symlink": true
            }
        }
    ]

app-modules/teams/composer.json

internachi/modularmake:moduleコマンドを使うと、モジュールが生成されます。

生成されたcomposer.jsonを、転用します。

app-modules/teams/composer.jsonは、下記の通りです。

{
    "name": "module/teams",
    "description": "",
    "type": "library",
    "version": "1.0",
    "license": "MIT",
    "autoload": {
        "psr-4": {
            "Modules\\Teams\\": "src/",
            "Modules\\Teams\Tests\\": "tests/",
            "Modules\\Teams\\Database\\Factories\\": "database/factories/",
            "Modules\\Teams\\Database\\Seeders\\": "database/seeders/"
        }
    },
    "minimum-stability": "stable",
    "extra": {
        "laravel": {
            "providers": [
                "Modules\\Teams\\Providers\\TeamsServiceProvider"
            ]
        }
    }
}

composer require

composer require module/teams

メリット

  • config/app.phpに、モジュール内のServiceProviderを、手動で追記しなくて良い
  • Composer Merge Pluginが要らない
  • バックエンドが、srcディレクトリ配下になり、スッキリする

後書き

しばらく使ってみましたが、今のところ、普通に使えています。

Local Package Aから、Local Package Bを、requireすることも出来ました。

*1:従来通り、modulesも可ですし、任意です