Laravelを使っていて統合開発環境(IDE)として何を使おうかと悩んでいました。
候補としては、NetBeansとPhpStormでした。
PhpStorm IDEはJetBrainsの製品で、有償ですが評判がよいです。
一方で、NetBeansは、Oracle(旧サンマイクロシステムズ)を中心としたオープンソースのコミュニティで開発されています。
悩んだのですが、無料であることは捨てがたく、NetBeansを使ってみて意外とちゃんと使えたので、いまはNetBeansを使っています。
目次
Laravel (PHP)をNetBeans 8.1で使う PHP組込みWebサーバーを使う
私の場合、WindowsのXAMPP環境でLaravelの開発を行っています。
XAMPPについては、こちらに記事を書きました。XAMPP
Laravelのプロジェクトのプロパティは以下のように設定してみました。
「実行構成」の中で、以下のように設定します。
実行方法(R):「PHP組込みWebサーバー(組込みWebサーバーで実行中)」
ホスト名(U)」:localhost
ポート(P):8000
ルーター・スクリプト(R):public/index.php
C:\xampp\php\php.ini に以下の行を追加します。
1 2 3 4 5 6 7 8 9 |
[XDebug] zend_extension = "C:\xampp\php\ext\php_xdebug.dll" xdebug.remote_enable = 1 xdebug.remote_autostart=on xdebug.remote_handler = "dbgp" xdebug.remote_host = "127.0.0.1" xdebug.remote_port=9000 xdebug.idekey="netbeans-xdebug" xdebug.remote_mode=req |
このように設定してから「デバッグ」⇒「プロジェクトをデバッグ」で実行します。
こうすると、PHPが持っているWebサーバーでLaravelが実行され、netbeans-xdebugがローカルブラウザと通信します。
そして結果として、ブラウザで操作しながら、NetBeansのPHPがステップ実行されます。
ほとんどの場合、組込みWebサーバーで問題はありません。
ちなみに、ブレイクポイントを設定していなくても、index.phpの22行目で必ずいったんブレイクしてしまいます。
require __DIR__.'/../bootstrap/autoload.php';
そのまま実行すれば、進みますがめんどくさいなぁ。
2016/12/5 追記
外部の識者から教えてもらいました。
オプション⇒PHPの画面で「最初の行で停止(T)」のチェックを外せば、最初の行で止まることはなくなります。
。。。そういえば、Visual StudioでもEclipseでも同じような設定があったなぁ。
デフォルトで「最初の行で停止(T)」をオンにする気持ちはなんか分かる。
Laravel (PHP)をNetBeans 8.1で使う ローカルWebサーバーを使う
ところで、組込みWebサーバーで不具合?っぽいことが発生しました。
詳細は以下に記載しました。
どうも、CDN(コンテンツデリバリネットワーク)から取得したBootstrapを使っている場合は問題ないのですが、ローカルで作成したBootstrapについては正しく読み込んでくれません。
1 |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> |
はOK。
1 |
<link rel="stylesheet" href="{{ URL::asset('css/app.css') }}" type="text/css"> |
は次のエラーが出ます。
Failed to load resource, the server responded with a status of 404(Not Found)
そこで、組込みのWebサーバーではなくて、XAMPPに付属のApacheを使うことにします。
プロジェクトのプロパティで以下のように設定します。
実行方法(R):「ローカルWebサイト(ローカルWebサーバーで実行中)」
プロジェクトURL(U)」:http://localhost/
開始ファイル(I):
こうして、デバッグ実行すると無事にデバッグ実行されました。
LaravelのPHPファイルの場所のメモ
Laravelは、MVCのデザインパターンに準拠していますが、Model、View、Controllerのファイルの場所はちゃんと整合性がとれていないようです。
それぞれのファイルは以下のフォルダにあります。
Model・・・appの下
View・・・resources\viewsの下
Controller・・・app\Http\Controllersの下
うーん、単純にModel、View、Controllerっていうフォルダを作ったらよかったんじゃないかな。
ViewのBladeファイルをNetBeansでステップ実行するには少しコツが入ります。
ViewのBladeファイルは、実行時にはコンパイルされて、storage\framework\viewsというフォルダに入っているからです。
ステップ実行するには、vendor\laravel\framework\src\Illuminate\View\Engines\PhpEngine.phpの42行目あたりにブレークポイントを入れておきます。
include $_path で止まったら、ステップインするとViewのPHPファイルをステップ実行できます。
この時、ファイル名を見てもらえれば分かりますが、元のファイル名ではなくて、暗号化?されているような文字列のファイル名になっています。
Laravelでエラーが出たときはログを見る
ところで、Laravelで開発しているときに、エラーが出れば必ずエラーのログを見るべきだと思います。
ログファイルは、storage\logs\laravel.log です。
ここにあるスタックトレースを見ればだいたいのことは理由がわかります。
例えば以下のエラーの場合、TokenMismatchExceptionが出ており、CSRFトークンがちゃんと入っていないことが原因と分かります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[2016-02-03 15:59:20] local.ERROR: exception 'Illuminate\Session\TokenMismatchException' in C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php:53 Stack trace: #0 [internal function]: Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure)) #1 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #2 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #3 [internal function]: Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #4 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #5 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #6 [internal function]: Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #7 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #8 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #9 [internal function]: Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) #10 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #11 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(59): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #12 [internal function]: Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure)) #13 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #14 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(44): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #15 [internal function]: Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) #16 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(124): call_user_func_array(Array, Array) #17 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #18 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request)) #19 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(122): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #20 C:\xampp\htdocs\blog\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(87): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #21 C:\xampp\htdocs\blog\public\index.php(54): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #22 {main} |
Laravel 5.1、日本語の詳しい解説書も出ましたね。
最後まで読んでいただきありがとうござました。
この記事が気に入っていただけたらシェアしてくれると嬉しいです。
コメント
オプション – PHP – デバッグ – 最初の行で停止
のチェックを外せば、止まらなくなりますよー。
おおお。なんと。ありがとうございます!
さっそく修正しておきました。