それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

laravel で phpunitのテスト実行時に、PhpStormからXdebugを有効にする。user.iniを有効にして実行

xdebug を有効にしてphpunitを実行したい。

Xdebug の設定をしたとしても、phpunit の設定だとか、xdebugや日付などの php.iniを作るのが不便。

プロジェクトを切り替える毎に、php.iniを見直すのは割と面倒くさい。

phpには user.iniがある

php には実行時に、php.iniを読み込んでグローバル設定を、プロジェクト毎の設定で上書きすることが出来る。

これを laravelから使う。

やりかた

  1. IntelliJ(phpStrorm)で xdebugをリッスンする
  2. xdebug を有効にする設定を書く
  3. デバッグポイントを指定する
  4. artisan コマンドで 2のiniを読み込む

.iniを作る

takuya@laravel$ cat - > .php.user.ini
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_log=/tmp/xdebug.log
xdebug.idekey=takuya1st

Laravel のホームディレクトリに user.iniを作る

artisanコマンドの定義

php artisan:make command RunTest

実行

php artisan test

ソースコード

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class RunTest extends Command
{
  
  /**
   * The name and signature of the console command.
   * @var string
   */
  protected $signature = 'test {filter?}';
  /**
   * The console command description.
   * @var string
   */
  protected $description = 'phpunit でテスト実行';
  
  /**
   * Create a new command instance.
   * @return void
   */
  public function __construct () {
    parent::__construct();
  }
  
  /**
   * Execute the console command.
   * @return mixed
   */
  public function handle () {
    $filter = '';
    if($this->argument('filter')) {
      $filter = $this->argument('filter');
      $filter = "--filter=/$filter/i";
    }
    $cmd = "./vendor/bin/phpunit". ' '.$filter;
    
    // laravel ルートディレクトリにある .user.ini を読み込ませる
    $ini_scan_dir = base_path();
    $addtional_env=" PHP_INI_SCAN_DIR=:$ini_scan_dir  ";
    $cmd =  $addtional_env.$cmd;
    
    
    // dd($cmd);
    passthru($cmd);
  }
}

JetBrains での設定

別途、記事にします。ご参考ください

ポイント

メリット

xdebug がぱぱっと使えるようになるとメッチャ捗る。

laravel のdd/dumpよりも楽になる。

とくに phpunit は複数がマルチに動くので debugger があると助かる。