まだXDebugが使えない環境で消耗してるの？The VarDumper Componentで快適な軽量デバッグをしてみよう

## 導入
こんにちは。```Symfony原理主義者``` を自称している者です。
(ほんとは小さなソフトハウスの2年目プログラマです。)

皆さん、デバッグ、してますか？？

PHPのデバッグといえば、ド定番のデバッグツール「XDebug」を利用し、IDEやエディタと繋げてGUIベースのステップ実行をするケースが非常に多いと思います。

しかし、XDebugが有効にされていると非常に処理が重たくなる場合があったり、開発環境の兼ね合い上どうしてもXDebugを使うことができなかったりと、話を聞いている限り上手にデバッグ環境を整えることができずに大変な思いをされている方は意外と多いように感じます。

そこで今回紹介したいのが、 [```The VarDumper Component```](https://symfony.com/doc/master/components/var_dumper.html) です。

※忙しい人は *ハンズオン* の部分から読んでもらえれば多少ショートカットになります。

## The VarDumper Component ってなんですか？
```The VarDumper Component``` は、Symfony Componentsの一つで、SymfonyやLaravelといった、実績のある有名フレームワークにパーツとして使われているライブラリの一つです。

基本的な使い方は組み込み関数の ```var_dump()``` と同じような形で、このコンポーネントをインストールすると使えるようになる ```dump()``` というグローバルスコープの関数に中身を出力したい変数を投げてやると、 ```var_dump()``` よりも綺麗なフォーマットで変数を出力してくれます。
また、  ```var_dump()``` を利用していると無駄に出力されてしまうオブジェクトの持つメタデータなどもイイカンジにしてくれるので、SymfonyやLaravelといったフレームワークを利用しているときにプリントデバッグする場合は、基本的にこちらを利用することになります。

```console
$hoge = 'ほげ';
dump($hoge);
```

なーんだ、うちはSymfonyでもLaravelでもないから関係ないや、と思ったそこのあなた！！チョット待ってください!!

```Symfony Components``` は***```数々の実績があり、歴史の長い超人気フルスタックWebフレームワーク,Symfony```***（原理主義者感）を構成するパーツの一つですが、それら一つ一つが機能性を完全に維持したコード(=バンドル)となっていて、 ```Composer``` を利用してインストールすることによりSymfonyとは関係ないプロジェクトでもバンドルを再利用できるようになっています！！
（このアーキテクチャがすごい！と思っているので私はSymfonyが好きです。）

## ハンズオン
前置きが長くなりましたが、 ```The VarDumper Component``` を手元で軽く動かしてみましょう。

今回、お話したい話題の都合上、執筆現在サポートされている中から [```v4.3.0```](https://symfony.com/doc/4.3/components/var_dumper.html) を利用していきたいと思います。
(これより上のバージョンならOKですが、システム要件に気をつけてください。)

### Requirements
下記に示したリリースノートの通り、```PHP v7.1.3``` 以上が必要になるのでご注意ください。
また、PHPのパッケージ管理ツール ```Composer``` を利用して行くことが前提になっていますが、そのインストールは割愛します。

https://packagist.org/packages/symfony/var-dumper#v4.3.0

### Installation
```console
$ mkdir sample-var-dumper
$ cd path/to/sample-var-dumper

# TheVarDumperComponent をインストールします
$ composer require --dev symfony/var-dumper "4.3.0"
```
インストールはなんとこれだけで完了です！！
```require``` サブコマンドに ```--dev``` オプションを付けたので、本番環境では弾いてインストールできる設定になっています。

### Demo
PHPのビルトインWebサーバを利用して、手元で簡単に動かしてみましょう。

適当なPHPファイルを作って、 ```dump()``` を使ってみます。

```php:index.php
<?php

require __DIR__.'/vendor/autoload.php';

$var = 'Symfony is God';

dump($var);
```
下記コマンドでビルトインWebサーバを立てて、動きを見てみます。

```console
$ php -S localhost:8000
```
http://localhost:8000

黒い帯に緑の文字で ```Symfony is God``` と出ていればあなたも既に立派なSymfony原理主義者です！！

## DumpServerを立てる
かなり長くなりましたが、実はここからが本題です。

ここまでで、 ```var_dump()``` を置き換えた綺麗なフォーマットのプリントデバッグを紹介しましたが、これでは ```var_dump()``` とほぼ変わりありません。

今回紹介したいのは本バンドルの機能である ```The Dump Server``` です。
この機能を使うと、監視用のサーバを立てることができるようになり、 ```dump()の結果をターミナルに出力できるようになります!!``` めっちゃ便利！！
(v3~だと、まだこの機能が追加されていないので注意です！！)

※ちなみにSymfony4を利用している場合は、下のコマンドを叩くだけですぐに使えるようになります！
　Laravelは未確認なので、時間がある時に確認しておきます…

```console
$ php bin/console server:dump
```

### Installation
この機能を利用するときは、コンソール機能を [```symfony/console```](https://symfony.com/doc/current/components/console.html) に依存するため、インストールが必要になります。

```console
$ composer require --dev symfony/console
```

下記コマンドで監視用のサーバを立てることができるようになります。

```console
$ ./vendor/bin/var-dump-server 

Symfony Var Dumper Server
=========================
                                                                                                     
 [OK] Server listening on tcp://127.0.0.1:9912                                                                                                                                                                                                  

 // Quit the server with CONTROL-C. 
```

### Demo
呼び出された ```dump()``` 関数の結果をコンソールに標準出力する処理を記述します。
さきほど書いた ```index.php ``` の requireの下に以下のソースコードを貼り付けてください。


```php:index.php
<?php

require __DIR__.'/vendor/autoload.php';

use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\ContextProvider\CliContextProvider;
use Symfony\Component\VarDumper\Dumper\ContextProvider\SourceContextProvider;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\Dumper\ServerDumper;
use Symfony\Component\VarDumper\VarDumper;

$cloner = new VarCloner();
$fallbackDumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg']) ? new CliDumper() : new HtmlDumper();
$dumper = new ServerDumper('tcp://127.0.0.1:9912', $fallbackDumper, [
    'cli' => new CliContextProvider(),
    'source' => new SourceContextProvider(),
]);

VarDumper::setHandler(function ($var) use ($cloner, $dumper) {
    $dumper->dump($cloner->cloneVar($var));
});

// ~~ 以下、略 ~~
```
そして監視コンソールを立てて…

```console
$ .vendor/bin/var-dump-server
```
下記のリンクからプログラムを実行してみます。
http://localhost:8000

```console
 -------- ----------------------------------------------------- 
  date     Mon, 16 Dec 2019 18:47:54 +0000                      
  source   index.php on line 26                                 
  file     /sample-var-dumper/index.php  
 -------- ----------------------------------------------------- 

"Symfony is God"
```

うおおお！！！！
**Symfony is God!!!**
**Symfony is God!!!**
**Symfony is God!!!**

*それではみなさん、よいSymfonyライフを！*