ちょっと前に作ったLaravelSail(Laravel8)の環境でパッケージ開発に挑戦してみました。
パッケージ開発手順
参考:Laravelパッケージ開発ハンズオン~環境編~ – Qiita
参考:パッケージ開発 8.x Laravel
上記の手順を参考に実際には以下のような作業となりました。
- パッケージ用に空のGitリポジトリを作成
- 構築済みのLaravelSail環境の直下にpackagesディレクトリ作成
- 1で作成したリポジトリをサブモジュールとしてpackages以下に追加
git submodule add https://github.com/imo-tikuwa/laravel-operation-logs.git operation-logs
- パッケージ内にcomposer.json作成、require,autoload,extraは追記
cd operation-logs composer init
"require": { "php": ">=8.0", "laravel/framework": "^8.54" }, "autoload": { "psr-4": { "ImoTikuwa\\OperationLogs\\": "src/" } }, "extra": { "laravel": { "providers": [ "ImoTikuwa\\OperationLogs\\Providers\\OperationLogsServiceProvider" ] } }
requireに記載したphpとlaravel/frameworkのバージョンは親となるLaravelSail環境のcomposer.jsonに揃えました。
- サービスプロバイダ作成
<?php namespace ImoTikuwa\OperationLogs\Providers; use Illuminate\Support\ServiceProvider; class OperationLogsServiceProvider extends ServiceProvider { /** * Initial startup process for all application services. * * @return void */ public function boot() { if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } $config_path = dirname(__DIR__, 2) . DS . 'config' . DS . 'operation_log.php'; $this->publishes([ $config_path => config_path('operation_log.php'), ], 'operation-log-config'); $this->loadMigrationsFrom(dirname(__DIR__, 2) . DS . 'database' . DS . 'migrations'); } }
参考元とディレクトリのパスの深さが違ったりで少し悩みました。
- Appのcomposer.jsonに開発中のパッケージをcomposerでインストールするための設定追加
"repositories": [ { "type": "path", "url": "./packages/operation-logs", "symlink": true } ],
- composerでパッケージをインストール(※コンテナ内で実行)
> sail exec laravel.test bash # composer require imo-tikuwa/laravel-operation-logs:dev-master
作ったものについて
GitHub - imo-tikuwa/laravel-operation-logs: Laravel8 access aggregation Middleware
Laravel8 access aggregation Middleware. Contribute to imo-tikuwa/laravel-operation-logs development by creating an account on GitHub.
CakePHP4で作ったOperationLogsプラグインをLaravel用パッケージとして作り変えました。
元のプログラムがあるのとミドルウェア自体の仕組みは同じなのでそこまで悩むことはありませんでした。
設定ファイルをApp直下にコピーする処理(vendor:publish)とか、マイグレート実行の際に自動でパッケージ以下のマイグレーションファイルを見に行くようにする(サービスプロバイダのloadMigrationsFrom)とかLaravel側で機能として提供されてるものはしっかりと使えているような気がします。
ソース内の文章は一応全部英語で書きました。ほとんど翻訳サイト使いました。
あと、今回の開発中にIDEの入力補完用のPHPDocをソースに追記してくれるパッケージがあることを知りました。これ、すごい便利なのでこれから携わるすべてのLaravelタスクに導入しようと思います。