laravelで新規プロジェクトを作成する機会があったので、 新規プロジェクトの作成手順から、デバッグするまでの手順をまとめました。 基本はvagrant + laravelで、公式?のHomesteadを使わせていただきました。

過去記事の「vagrantでLaravelの開発環境構築」は、 私が1から作成した開発環境構築ですが、公式?のものの方がもちろん精度が高いでしょうし、こちらをお勧め致します。

IDEは「Visual Studio Code」を使用しました。 プロジェクト名の「sample_project」は適宜変えていただけばと思います。

では早速。

前提条件

Virtual Box, vagrantのインストールが完了しているものとします。 【Laravel超入門】開発環境の構築(VirtualBox + Vagrant + Homestead + Composer) 詳しくはこちらのサイトが参考になります。

プロジェクトディレクトを作成

$ mkdir sample_project
$ cd sample_project

プロジェクトをダウンロードして初期化

$ vagrant box add laravel/homestead
$ git clone https://github.com/laravel/homestead.git ./
$ bash init.sh

ダウンロードに少々時間がかかります。 ダウンロード後、環境に合わせてHomestead.yamlを変更する必要があります。

Homestead.yaml

私の場合はこのように設定しました。

$ cat Homestead.yaml
---
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/projects/sample_project/laravel/
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/public

databases:
    - homestead

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 50000
#       to: 5000
#     - send: 7777
#       to: 777
#       protocol: udp

「folders」の「map」を、プロジェクトのルートディレクトリにしたいパスに修正します。

鍵を作成

$ ssh-keygen -t rsa
$ ls -la I grep .ssh

鍵がある場合は省略して結構です。

起動

$ vagrant up

エラーが出た

もしエラーが出ず終わった方は、こちらの手順は飛ばしていただいて結構です

$ vagrant up
Bringing machine 'homestead-7' up with 'virtualbox' provider...
==> homestead-7: Importing base box 'laravel/homestead'...
==> homestead-7: Matching MAC address for NAT networking...
==> homestead-7: Checking if box 'laravel/homestead' is up to date...
==> homestead-7: Setting the name of the VM: homestead-7
==> homestead-7: Clearing any previously set network interfaces...
==> homestead-7: Preparing network interfaces based on configuration...
    homestead-7: Adapter 1: nat
    homestead-7: Adapter 2: hostonly
==> homestead-7: Forwarding ports...
    homestead-7: 80 (guest) => 8000 (host) (adapter 1)
    homestead-7: 443 (guest) => 44300 (host) (adapter 1)
    homestead-7: 3306 (guest) => 33060 (host) (adapter 1)
    homestead-7: 4040 (guest) => 4040 (host) (adapter 1)
    homestead-7: 5432 (guest) => 54320 (host) (adapter 1)
    homestead-7: 8025 (guest) => 8025 (host) (adapter 1)
    homestead-7: 27017 (guest) => 27017 (host) (adapter 1)
    homestead-7: 22 (guest) => 2222 (host) (adapter 1)
==> homestead-7: Running 'pre-boot' VM customizations...
==> homestead-7: Booting VM...
==> homestead-7: Waiting for machine to boot. This may take a few minutes...
    homestead-7: SSH address: 127.0.0.1:2222
    homestead-7: SSH username: vagrant
    homestead-7: SSH auth method: private key
    homestead-7: Warning: Connection reset. Retrying...
    homestead-7:
    homestead-7: Vagrant insecure key detected. Vagrant will automatically replace
    homestead-7: this with a newly generated keypair for better security.
    homestead-7:
    homestead-7: Inserting generated public key within guest...
    homestead-7: Removing insecure key from the guest if it's present...
    homestead-7: Key inserted! Disconnecting and reconnecting using new SSH key...
==> homestead-7: Machine booted and ready!
==> homestead-7: Checking for guest additions in VM...
==> homestead-7: Setting hostname...
==> homestead-7: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifdown 'eth1' || true
/sbin/ip addr flush dev 'eth1'
# Remove any previous network modifications from the interfaces file
sed -e '/^#VAGRANT-BEGIN/,$ d' /etc/network/interfaces > /tmp/vagrant-network-interfaces.pre
sed -ne '/^#VAGRANT-END/,$ p' /etc/network/interfaces | tac | sed -e '/^#VAGRANT-END/,$ d' | tac > /tmp/vagrant-network-interfaces.post
cat \
  /tmp/vagrant-network-interfaces.pre \
  /tmp/vagrant-network-entry \
  /tmp/vagrant-network-interfaces.post \
  > /etc/network/interfaces
rm -f /tmp/vagrant-network-interfaces.pre
rm -f /tmp/vagrant-network-entry
rm -f /tmp/vagrant-network-interfaces.post

/sbin/ifup 'eth1'

Stdout from the command:

Stderr from the command:

bash: line 5: /sbin/ifdown: No such file or directory
bash: line 19: /sbin/ifup: No such file or directory

原因

ネットワーク設定でエラーが出ている?みたいでした。

対策

ネットワークを再設定することで解決できました。

$ vagrant ssh
(vagrant)$ sudo apt-get install ifupdown
(vagrant)$ exit
$ vagrant reload

laravelのセットアップ

改めて、セットアップの続きを行います。

$ vagrant ssh
(vagrant)$ cd code
(vagrant)$ composer create-project laravel/laravel --prefer-dist ./

アクセス

セットアップが完了したらまずは正常に動作しているか確認をして見ます。 http://192.168.10.10/

githubに登録

わたしの場合はgithubでプロジェクト管理を行いたいので、リモートの登録を行いました。 特にgitで管理をする必要がないのであれば、こちらの手順も飛ばしていただいて結構です。

$ git init
$ git remote add origin git:[your name]/sample_project.git
$ git add *
$ git commit -m "first commit"
$ git push -u origin master

デバッグの設定

続いて、デバッグの設定を行います。 どうやら公式のHomesteadだとxdebugをサポートしていないみたいで、 自らインストールする必要があります。

xdebugの設定を確認

https://xdebug.org/wizard.php こちらのサイトにアクセスして、

$ php-fpm7.2 -i

こちらのコマンド結果を張り付けて出力されたコマンドを実行すれば良いみたいです。 私の場合は以下のコマンドでインストールができました。

xdebugのインストール

(vagrant)$ cd ~
(vagrant)$ mkdir tmp && cd tmp
(vagrant)$ wget http://xdebug.org/files/xdebug-2.6.0.tgz
(vagrant)$ tar -xvzf xdebug-2.6.0.tgz
(vagrant)$ cd xdebug-2.6.0
(vagrant)$ phpize
(vagrant)$ ./configure
(vagrant)$ make
(vagrant)$ sudo cp modules/xdebug.so /usr/lib/php/20170718
(vagrant)$ sudo vim /etc/php/7.2/fpm/php.ini
zend_extension = /usr/lib/php/20170718/xdebug.so
(vagrant)$ sudo service nginx restart

xdebugセットアップ

xdebugのインストール後の設定を行います。

(vagrant)$ sudo vi /etc/php/7.2/fpm/conf.d/20-xdebug.ini
zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 1
xdebug.remote_port = 9001
xdebug.max_nesting_level = 512

portが9000だとなぜか上手くいかない情報があったので、 合わせて9001に変更しました。

(vagrant)$ php-fpm7.2 -i | grep debug

こちらのコマンドで、debugの設定ができているか確認。

リロード

(vagrant)$ exit
$ vagrant reload

Visual Studio Code

続いて、Visual Studio Codeの設定を行います。 「PHP debug」をインストールして、設定を行います。 私の場合は以下のように設定しました。 ※「参考」のセクションのリンクから、細かい設定方法のやり方がわかります。

launch.json

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9001,
            "pathMappings": {
                "/home/vagrant/code": "${workspaceRoot}"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9001
        }
    ]
}

無事、Laravel + vagrantの開発環境構築(デバッグあり)を作成することができました。 phpのdebugができるので、作業効率が上がります!

参考

以下のサイトを参考にさせて頂きました。ありがとうございます。