質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Lumen

PHP Laravel製のマイクロフレームワーク

Q&A

解決済

1回答

563閲覧

Lumen でクロージャコマンドを定義したい

mochi.monaka

総合スコア26

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Lumen

PHP Laravel製のマイクロフレームワーク

0グッド

0クリップ

投稿2017/09/10 20:42

###前提

Laravel では routes/console.php

php

1Artisan::command('inspire', function () { 2 ... 3});

のようにコマンドをインラインで定義するだけで、
ターミナルで php artisan inspire として実行できます。

###やりたいこと

Lumen 5.5 をインストールしたところ、これと同じことはできませんでしが、
他の書き方やパッケージ追加などで、同じこと(app/Console/Commands/ に1コマンド1ファイルで定義するのでなくクロージャコマンドの仕組みで手軽に定義)は実現できるでしょうか?

###試したこと

ファサードを有効に(Artisan::と書けるように)して、
routes/console.php にファイルを設置して、
bootstrap/app.app にて

php

1$app->router->group([ 2 'namespace' => 'App\Http\Controllers', 3], function ($router) { 4 require __DIR__.'/../routes/web.php'; 5 require __DIR__.'/../routes/console.php'; // 追加 6});

ルート定義を追加で読ませました。

ターミナルでコマンドを実行しようとすると、
Call to undefined method App\Console\Kernel::command()
と表示されました。
console.php までは到達しているものの Artisan::command() メソッドが無いようでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、routerにコンソールを読み込ませても意味がありません。

LumenとLaravelのapp/Console/Kernel.phpを見ましょう。

Lumen:https://github.com/laravel/lumen/blob/v5.5.0/app/Console/Kernel.php
Laravel:https://github.com/laravel/laravel/blob/v5.5.0/app/Console/Kernel.php

Lumenにはcommandsメソッドがなく、Laravelにはcommandsメソッドが存在します。
どうやら、ここでroute/console.phpを返していることがわかります。
(なのでrouteに入れても意味はないように感じます。(もしも処理がConsoleでも読み込んでいるのであれば違うでしょうけども))

そして元の継承しているクラスも異なることがわかります。

また、commandメソッドがない点に関しては

https://github.com/laravel/framework/blob/5.5/src/Illuminate/Foundation/Console/Kernel.php#L179-L188
この処理がごそっと無いのが原因です。

なのでこのcommandメソッドをごっそり移動すればcommandメソッドは動くかもしれません。

実際にチェックをしていないので予想でしかありませんが、
Laravelの方のConsole/Kernel.phpのcommandsメソッドをrequire base_path('routes/console.php');の箇所だけ移植し、handleメソッドのreturn $this->getArtisan()->run($input, $output);の手前の行に移植したcommandsメソッドを読むようにすることで解決するかもしれません。

追記:
実際にやってみた所動作致しましたので、手順を以下で説明しているので良かったら見てください。
http://qiita.com/fagai/items/557d682dc5638d17adfc

投稿2017/09/10 23:19

編集2017/09/11 00:16
fagai

総合スコア2158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mochi.monaka

2017/09/11 00:49

ありがとうございます。 `$this->comment()` のほかにも、`$this->table()` したり、コマンド一覧に `->describe()` の説明をリストアップしたりなど、Laravel 同等に利用できるようになりました! まだ、Qiita の記事を手順そのままに書いて動作確認できたまでで、理解はきちんとできていないので、これから追ってみたいと思います!
mochi.monaka

2017/09/11 15:55

解決はしましたが、その後使っていて気づいた点を一応追記しておきます。 Laravel 同等というのはちょっと違っていたようで、 動的に `Artisan::call('mycommand');` と呼ぶことができませんでした。 `CommandNotFoundException Command "mycommand" is not defined.` と言われます。 `Artisan::call('help');` とするとエラーにならないので、自分で定義したコマンドだけ見つけられないようでした。 Laravel で試してみると、ユーザ定義のクロージャコマンドも `Artisan::call()` で実行できました。
fagai

2017/09/11 16:16 編集

それはそうでしょう。(同等という話) 中身の実装は結構違いますから。。。 正直Laravelと同じくらい使うのであればLaravelを使ったほうが良いです。 callメソッドも同様に移植することで対応出来るでしょう。ただ、前回$this->commandsLoadedを追加してないので、そちらも追加しておくと良いでしょう。 一応内容を追加したものを記事に適用しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問