参考にした記事
使用したバージョン
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 │ --省略--
前書き
参考にした記事は、Laravel
でModule
を扱う方法について書いてあります。
動画を視聴して、internachi/modular
を試してから、この記事を読んだ方が理解できるかもしれません。
Module
をCompsoer Local Package
として、使います。
私も過去に色々試したのですが、その当時は、ベストな方法が見つかりませんでした。
nwidart/laravel-modules
や、internachi/modular
を使うと、Laravel
がバージョンアップした時に、すぐ追従してくれないと困る場合があります。
だから、nwidart/laravel-modules
やinternachi/modular
を使わない方法を模索しました。
今回も、nwidart/laravel-modules
やinternachi/modular
は使いません。
本題
PHP
やComposer
のバージョンが上がっているので、過去の記事は忘れてください。
ディレクトリ作成
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/modular
のmake: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も可ですし、任意です