質問: ### 前提 Laravel では `routes/console.php` に ``` Artisan::command('inspire', function () { ... }); ``` のようにコマンドをインラインで定義するだけで、 ターミナルで `php artisan inspire` として実行できます。 ### やりたいこと Lumen 5.5 をインストールしたところ、これと同じことはできませんでしが、 他の書き方やパッケージ追加などで、同じこと(`app/Console/Commands/` に1コマンド1ファイルで定義するのでなくクロージャコマンドの仕組みで手軽に定義)は実現できるでしょうか? ### 試したこと ファサードを有効に(`Artisan::`と書けるように)して、 `routes/console.php` にファイルを設置して、 `bootstrap/app.app` にて ``` $app->router->group([ 'namespace' => 'App\Http\Controllers', ], function ($router) { require __DIR__.'/../routes/web.php'; require __DIR__.'/../routes/console.php'; // 追加 }); ``` ルート定義を追加で読ませました。 ターミナルでコマンドを実行しようとすると、 `Call to undefined method App\Console\Kernel::command()` と表示されました。 `console.php` までは到達しているものの `Artisan::command()` メソッドが無いようでした。
回答: まず、routerにコンソールを読み込ませても意味がありません。 LumenとLaravelの`app/Console/Kernel.php`を見ましょう。 Lumen: Laravel: Lumenにはcommandsメソッドがなく、Laravelにはcommandsメソッドが存在します。 どうやら、ここで`route/console.php`を返していることがわかります。 (なのでrouteに入れても意味はないように感じます。(もしも処理がConsoleでも読み込んでいるのであれば違うでしょうけども)) そして元の継承しているクラスも異なることがわかります。 また、commandメソッドがない点に関しては この処理がごそっと無いのが原因です。 なのでこのcommandメソッドをごっそり移動すればcommandメソッドは動くかもしれません。 実際にチェックをしていないので予想でしかありませんが、 Laravelの方のConsole/Kernel.phpのcommandsメソッドを`require base_path('routes/console.php');`の箇所だけ移植し、handleメソッドの`return $this->getArtisan()->run($input, $output);`の手前の行に移植したcommandsメソッドを読むようにすることで解決するかもしれません。 追記: 実際にやってみた所動作致しましたので、手順を以下で説明しているので良かったら見てください。