Hyper-V上のLaravel HomesteadをIntelliJ IDEAからデバッグ

Hyper-V上のLaravel HomesteadをIntelliJ IDEAからxdebugでデバッグする方法です。特にネットワークの設定にHyper-V環境特有の注意が必要でしたので記しておきます。

**2022-10-31 追記**
以下環境にて、新たに仮想スイッチを作成すること無く、単に`vagrant up`後に接続先スイッチとしてDefault Switchを指定し、InteliJ IDEAの設定とChromeの設定のみを行えれば、デバッグ可能でした。

* Windows 11 Pro (22H2)
* IntelliJ IDEA 2022.2.3
* Chrome 106
* Vagrant 2.3.2
* PHP 7.4
* Vagrant Box laravel/homestead (hyperv, 9.6.0)
* PHP Package laravel/homestead v10.17.0

**追記ここまで**

# 筆者の環境

* Windows 10 Pro (1903)
* IntelliJ IDEA 2019.2.3
* Chrome 77
* Vagrant 2.2.5
* PHP 7.3
* Vagrant Box laravel/homestead (hyperv, 8.2.0)
* PHP Package laravel/homestead v9.2.2

# 仮想スイッチの設定

仮想マシンが接続する仮想スイッチが、既定で用意されているDefault Switchになっていると、xdebugからWindows側への接続が妨げられるため、新たに作成した仮想スイッチに接続するようにしてください。Hyper-Vマネージャーの仮想スイッチマネージャーより、以下のように外部ネットワークに接続する仮想スイッチを作成します。

![HyperVSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12670/3d987516-bc56-4160-3c02-f7080737e7d3.png)

Windowsの設定のネットワークの設定より以下のように、追加した仮想スイッチのIPv6を無効にします。なお、従来のイーサネット接続のIPv4, IPv6は無効になっていますが、仮想スイッチの作成によるものであり、異常ではありません。

![HyperVSwitch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12670/b8311855-83a2-abcd-6ccf-328d21e088b8.png)


初回の`vagrant up`で仮想マシンを作成する際に接続先スイッチを問われますので、上記で作成した仮想スイッチを選択してください。既に仮想マシンを作成していた場合は、`vagrant destroy`で一旦削除してください。

```
> vagrant up
Bringing machine 'YOURPROJECT' up with 'hyperv' provider...
==> YOURPROJECT: Verifying Hyper-V is enabled...
==> YOURPROJECT: Verifying Hyper-V is accessible...
==> YOURPROJECT: Importing a Hyper-V instance
    YOURPROJECT: Creating and registering the VM...
    YOURPROJECT: Successfully imported VM
    YOURPROJECT: Please choose a switch to attach to your Hyper-V instance.
    YOURPROJECT: If none of these are appropriate, please open the Hyper-V manager
    YOURPROJECT: to create a new virtual switch.
    YOURPROJECT:
    YOURPROJECT: 1) DockerNAT
    YOURPROJECT: 2) External Switch
    YOURPROJECT: 3) Default Switch
    YOURPROJECT:
    YOURPROJECT: What switch would you like to use? 2
```

# Bonjourの設定

WindowsからのBonjourによる仮想マシンの検索を有効にするため、[Bonjour Print Services](https://support.apple.com/kb/dl999?locale=ja_JP)をインストールしてください。

これにより、例えば`Homestead.yaml`の記載が、

```yaml
hostname:example
```

であったとき、Windows側で`example.local`のホスト名を解決できるようになります。Windows側で`ping example.local`などのコマンドを実行してホスト名が解決できることを確認できます。

# Homesteadの設定

Homestead内にて、PHPのバージョンを確認します。

```sh
php -v
```

該当バージョンのPHPについて、設定を変更します。

```sh
sudo vi /etc/php/7.3/fpm/conf.d/20-xdebug.ini
```

`20-xdebug.ini`に、所望のIDE Key（`PHPSTORM`等）を設定します。

```
xdebug.idekey = PHPSTORM
```

再起動します。

```sh
sudo service php7.3-fpm restart
```

# InteliJ IDEAの設定

[File]-[Settings] の [Languages & Frameworks]-[PHP]-[Servers] にて以下を設定します。

* Hostに、Homesteadのホスト名（`example.local`や`homestead.test`）を設定。
* DebuggerにXdebugを選択。
* Project filesのルートのAbsolute path on the serverに、Homestead上のパス（通常`/home/vagrant/code`）を設定。

[Run]-[Edit Configurations]にて以下を設定します。

* PHP Remote Debugを追加。（Filter debug connection by IDE keyは設定しなくても構いません）

[Run]-[Debug]より上記で追加したConfigurationを実行します。

なお、IntelliJ IDEAは、xdebugからの接続をListenする側になります。

# Chromeの設定

[Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc)をインストールします。

Xdebug helperのオプションより、Homesteadに設定したIDE key（`PHPSTORM`等）を設定します。

Xdebug helperのメニューより、Debugを開始します。

以上で、Chromeよりデバッグ対象のページにアクセスすれば、xdebugからIntelliJ IDEAに接続されます。