Laravelウルトラ超入門　Mac環境構築(Vagrant+Virtualbox+Homestead+Composer)から入門アプリケーション、複数アプリケーションの管理(DB等)まで

##書くに至った経緯
はじめまして！
ruby,Railsを一通り終えて（そんなに出来ない、、）次は案件多くて名前かっこいいPHPをやってみようと適当な理由で学習し、フレームワークは『今はLaravelだろ！！』という声もあり（これも理由はふわっとしてますww）
フレームワークはLaravelを用いてやってみようと思ったのですが、初心者なんで環境構築でも詰まるわ、複数管理するのはどうしたらいいの？？次何からやったらいいか分かんない！！
って事でそこまでの最短と最初に作ってよかったなと思ったデモアプリまで書いていこうと思います。
やっぱりこれから何個もプロジェクト作れるようになるところまでが環境構築ですよね！
初心者の自分が困った箇所も色々書いていこうと思います。
対象としてはVagrant,Virtualboxで一回は環境構築した事あるよって人向けですが、初心者にも分かりやすく必要以上に丁寧に書こうと思うので温かい目で見てやってください

おまけ：Homesteadで複数のアプリケーションを動かす
参考：PHPフレームワークLaravel Webアプリケーション開発「現場で使えるプロのテクニック」
　　　初めてのLaravelチュートリアル
　　　https://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel


##前提
Vagrant
Virtualbox
Git
ここまでは記事も多いので頑張って来てください！！


##手順
Homesteadのダウンロード
↓
Homesteadの設定
↓
Vagrantの起動
↓
入門アプリケーション
↓
おまけ

ざっくりこんな感じで進めていきます。
ではやっていきましょう！！


##Homesteadのダウンロード
ホームディレクトリかデスクトップでも（おそらくどこでも大丈夫）いいので下記のコマンドで仮想環境のセットをダウンロードしましょう。

```
$ vagrant box add laravel/homestead
```
下みたいに仮想環境ソフトウェアを聞かれるのでvirtualboxを選択してください。

```
This box can work with　multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) virtualbox
3) vmware_desktop

Enter you choice: 2 　←この場合はvirtualboxが『２』なので２を選択
```

結構長いので辛抱強く待っててください。

```
box: Successfully added box .....（略） for 'virtualbox'!
```

上が出たら正常に終了してます。

```
ホームディレクトリに移動（「〜」←このディレクトリです）
$　cd

git cloneでダウンロード
$git clone https://github.com/laravel/homestead.git Homestead
```

これはサクッと終わります。


##Homesteadの設定
Homesteadの初期化をしていきます。

```
Homesteadディレクトリに移動して
$ cd ~/Homestead

初期化
$ bash init.sh
```

ここからはVimの操作が入ってきます（説明するので分からない方は気にしないでください）

```
Homesteadディレクトリで
$ vi Homestead.yaml
```
すると

```Homestead.yaml
---
  ip: "192.168.10.10"
  memory: 2048
  cpus: 1
  provider: virtualbox
  
  authorize: ~/.ssh/id_rsa.pub
  
  keys:
      - ~/.ssh/id_rsa
 
  folders:
      - map: ~/code
        to: /home/vagrant/code
 
  sites:
      - map: homestead.test
        to: /home/vagrant/code/public
 
  databases:
      - homestead
 
  # ports:
  #     - send: 50000
  #       to: 5000
  #     - send: 7777
  #       to: 777
  #       protocol: udp
 
  # blackfire:
  #     - id: foo
  #       token: bar
  #       client-id: foo
  #       client-token: bar
 
  # zray:
  #  If you've already freely registered Z-Ray, you can place the token here.
  #     - email: foo@bar.com
  #       token: foo
  #  Don't forget to ensure that you have 'zray: "true"' for your site.
```

上のようにデフォルトの状態になっていると思います
この

```
sites:
    - map: homestead.test
      to: /home/vagrant/code/public
```
の部分を

```
sites:
    - map: homestead.test
      to: /home/vagrant/code/sampleapp/public
```
に変えてください。（sampleappはこれから作るデモアプリの名前）

vimには特別な操作が必要なのでここではとりあえずファイルを開いたら『i』を押してください、そこからは方向キーを使って移動して上のように変更してください。
変更したら『esc』キーを押してください、その後、『:wq』を押してエンターキーを押してくださいそうしたら保存され、元の画面に戻るはずです。
vimの操作を習得したい方は他で練習してください、、
ちなみにvim使えるようになると開発速度も上がりますし、便利でおすすめです。


##共有ディレクトリ、hostsの設定
上が上手くいったら、

```
ホームディレクトリに移動して
$ cd

codeというディレクトリを作ります。
$ mkdir code
```

そうしたら

```
etcディレクトリに移動して
$ cd /etc

管理者権限でhostsファイルを開きます。
$ sudo vi hosts
```
passwordを聞かれますがmacのパスワードでOKです。

```hosts
##
  # Host Database
  #
  # localhost is used to configure the loopback interface
  # when the system is booting.  Do not change this entry.
  ##
  127.0.0.1　localhost
  255.255.255.255　broadcasthost
  ::1             localhost
```

こうなってると思うので一番下に上のvimの操作の通り

```
192.168.10.10 homestead.test
```

を追加してあげてください。

##Vagrantの起動
ここまでくれば環境構築は後少しで終わりです。
頑張りましょう！！

```
Homesteadディレクトリに移動
$ cd ~/Homestead

Vagrantを起動
$ vagrant up
```
だけです！！笑
##Laravelのデモアプリ

ではサンプルアプリを作って環境構築出来ているか確認しましょう。

```
Homesteadディレクトリで
$ vagrant ssh

ssh接続した後に
$ cd ~/code

laravelプロジェクトの作成
$ composer create-project laravel/laravel sampleapp --prefer-dist "5.5.*"
```

上の方法だとlaravelのバージョン指定が可能です。

```
しなくて大丈夫です。
$ laravel new sampleapp
```

このコマンドだと最新のバージョンで作成されます。
学習段階であるなら、適時バージョン指定して学習を進める事をお勧めします。（変なところで詰まるから）

これでプロジェクトも作成されたので

```
http://homestead.test
```
にアクセスしてみましょう

<img width="1676" alt="スクリーンショット 2019-02-03 17.09.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/325069/beaa521e-87d2-fdcb-8875-bc739528e6cc.png">

この画面になれば環境構築は成功しています。
お疲れ様でした！！！

環境構築のみの方はここまでで問題ありません頑張ってください。（おまけは読むことをお勧めします、、）

ではデモアプリに入っていきましょう！！

##デモアプリケーション
先ほど作成したsampleappを好みのエディタで開きましょう
ホームディレクトリのcodeの中にあるのでfinderを開いて画面左上の移動を押してそこからホームを選択して移動してcodeの中のsampleappを丸ごとエディタで開きましょう

<img width="481" alt="スクリーンショット 2019-02-03 17.13.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/325069/81e69538-8c77-2ebf-b7b4-542082f3f8e1.png">

ディレクトリの説明等は他の記事で勉強してください。
今回は投稿、削除機能、一覧機能を実装するデモアプリです。

ではssh接続した状態で

```
ディレクトリに移動
$ cd ~/code/sampleapp
その後
$ php artisan make:model Task -m -c -r
```

このコマンドでマイグレーションファイル、コントローラ、モデルが作られます。便利ですね、

ではまず、マイグレーションファイルをいじってみましょう。

database/migrationsの中にあります。

function upの中を

```2018_xx_xx_xxxxxxxx_create_tasks_table.php

public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }
```

のようにnameカラムを足してください。これはrailsでも見慣れた光景ですね
その後はもちろんマイグレーションです
laravelではこのコマンドになります。

```
$ php artisan migrate
```

これでtasksテーブルが作られました。
念の為mysqlを確認しましょう。

```
$ mysql --host=localhost --user=homestead --password=secret homestead
```

mysqlに繋ぐコマンドなので頻発するので.bash_profileに入れてもいいかも知れませんね！

```
mysqlに入ったら
$ show tables;
$ desc tasks;
```
これでtasksテーブルがあるのを確認してください
ちなみにshow databases; で確認できるhomesteadをデータベースで使っています。
これはおまけで説明します。


###ルーティング設定
laravelのルーティングはroutes/web.phpで管理しています。（多分、、）

web.phpを開いたら

```web.php
Route::get('/', function(){return redirect('/tasks');});
Route::get('/tasks', 'TaskController@index');
Route::post('/tasks', 'TaskController@store');
Route::delete('/tasks/{id}', 'TaskController@destroy');
```

を追加します。
デフォルトの記述は消して下さい。


###コントローラー
MVCのCに当たるコントローラーの設定です。
場所はapp/Http/Controllers/にあります。先ほど作成したTaskController.phpを開いて下さい。

```TaskController.php
<?php

namespace App\Http\Controllers;

use App\Task;
use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        $tasks = Task::all();
        return view('tasks', ['tasks' => $tasks]);
    }

    public function store(Request $request)
    {
        $task = new Task;
        
        $task->name = request('name');
        $task->save();
        return redirect('/tasks');
    }

    public function destroy(Request $request, $id, Task $task)
    {
        $task = Task::find($id);
        $task->delete();
        return redirect('/tasks'); 
    }
}
```

中身をこのように変更して下さい。
他のcreate等のメソッドはそのままで大丈夫です。

use文がキモだったりします、、


###ビューの作成
MVCのVに当たるものです。
viewはresources/views/の中にあります。ここに新たにlayout.blade.phpを作成して下さい。
.bladeはphpの記述をサッパリさせるものと覚えといて下さい。
これはrailsでいう　application.html.erbです@yieldに他のビューが埋め込まれます。

```layout.blade.php
<!DOCTYPE html>
<html>
    <head>
        <title>Task List</title>
        <!-- CSS And JavaScript -->
        <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,300italic,700,700italic">
        <link rel="stylesheet" href="//cdn.rawgit.com/necolas/normalize.css/master/normalize.css">
        <link rel="stylesheet" href="//cdn.rawgit.com/milligram/milligram/master/dist/milligram.min.css">
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>
```

<link>の部分はMIlligramというある程度見た目を整えてくれるものを使用しています。
（見た目は今回はどうでもいいので、、）

後は一覧表示させるtasks.blade.phpをまたresources/views/の中に作成します。

```tasks.blade.php
@extends('layout')

@section('content')
    <h1>Task List</h1>
    <form action="/tasks" method="POST" class="form-horizontal">
        {{ csrf_field() }}
        <!-- Task Name -->
        <div class="form-group">
            <label for="task" class="col-sm-3 control-label">Task</label>
            <div class="col-sm-6">
                <input type="text" name="name" id="task-name" class="form-control">
            </div>
        </div>

        <!-- Add Task Button -->
        <div class="form-group">
            <div class="col-sm-offset-3 col-sm-6">
                <button type="submit" class="btn btn-default">
                    <i class="fa fa-plus"></i> Add Task
                </button>
            </div>
        </div>
    </form>

    <!-- Current Tasks -->
    <h2>Current Tasks</h2>
    <table class="table table-striped task-table">
        <thead>
            <th>Task</th><th>&nbsp;</th>
        </thead>

        <tbody>
            @foreach ($tasks as $task)
                <tr>
                    <!-- Task Name -->
                    <td>
                        <div>{{ $task->name }}</div>
                    </td>
                    <td>
                        <form action="/tasks/{{ $task->id }}" method="POST">
                            {{ csrf_field() }}
                            {{ method_field('DELETE') }}                    
                            <button>Delete Task</button>
                        </form>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection
```


駆け足ですがこれでデモアプリケーションは完成しています。
これでhttp://homestead.test/tasks/　
アクセスすると動きが見れます。

コードの詳しい説明は
参考にさせて頂いた
https://paiza.hatenablog.com/entry/2018/02/16/paizacloud_laravel
に丁寧に分かりやすく書かれてあるので読んで置いてください（少し内容をlocal環境に合わせるために変更しています。）


お疲れ様でした！！！
後は作りたいものがある方はそれを実現させれるように頑張って、とりあえず勉強したい方はlaravel　入門などでググって色々作って見る事をおすすします！



##おまけ（複数のアプリケーションを管理する）

このままではこのデモアプリケーションしか動作しません
それでは困るので２つ目以降の時の変更点を紹介します。（ここで自分は詰まりました、、）
実際にsampleapp_twoというプロジェクトを作ると想定して説明します。

```
ssh接続した状態で先ほどのようにプロジェクトを作成します。
ディレクトリは~/codeで実行して下さい。

$ composer create-project laravel/laravel sampleapp_two --prefer-dist "5.5.*"
```

そうしたらssh接続を抜けて（必要あるかは？）~/Homesteadに移動してください

```
ssh接続を抜ける
$ exit

移動
$ cd ~/Homestead
```

で先ほど開いたHomestead.yamlをviで編集します。

```
$ vi Homestead.yaml
```

```Homestead.yaml
sites:
    - map: homestead.test
      to: /home/vagrant/code/sampleapp/public

    - map: sampleapptwo.app     ←追加
      to: /home/vagrant/code/sampleapp_two/public　　　　　←追加
```

この2行を追加してください(インデントは合わせてください)
さらに

```Homestead.yaml
databases:
    - homestead
    - app   ←追加（データーベース名なんでもいい）
```

を追加して

```
etcに移動
$ cd /etc

hostsファイルを開く
$ sudo vi hosts
```

一番下に

```
192.168.10.10 sampleapptwo.app
```

を追加してください。

```
sampleapp_twoに移動します
$ cd ~/code/sampleapp_two

.envファイルを開きます。
$ vi .env
```

そしてDB_DATABASEを以下のように変更してください。
DB_USERNAMEはそのままで大丈夫です。（ここでハマりました）

```.env
DB_DATABASE=app
```

これで設定はOKです

```
Homesteadに移動
$ cd ~/Homestead

vagrant停止
$ vagrant halt

vagrant起動　
$ vagrant up --provision
```

これで
http://sampleapptwo.app
にアクセスすると二つ目のアプリケーションにアクセスできます。

ちなみに

```
ssh接続した後
$ mysql --host=localhost --user=homestead --password=secret homestead

$ show databases;

```

これでappデータベースが作成されているかと思います。


３つ目以降も同じ方法で大丈夫かと思います！


##最後に
ここまでお付き合いしていただきありがとうございます。
自分自身もコマンド一つ一つの説明ができる程ではありませんが書かせてもらいました。
知識がある方には無駄な記述が多いかと思いますがこれで初心者の方が早くアプリケーション開発に進んでくれればと思います。
うる覚えなのでもしかしたら抜けているところがあるかも知れませんが、この後進めない！って箇所があればコメント下されば適時対応します。

アプリケーション開発の勉強したいのに環境構築で詰まるとやる気無くなっちゃいますよね、、
自分自身もこれからゴリゴリlaravelで開発していきたいと思います！！

お疲れ様でした！