Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

書くに至った経緯

はじめまして!
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が『2』なので2を選択

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

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です。

##
  # 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

にアクセスしてみましょう

スクリーンショット 2019-02-03 17.09.07.png

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

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

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

デモアプリケーション

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

スクリーンショット 2019-02-03 17.13.56.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>

の部分は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 入門などでググって色々作って見る事をおすすします!

おまけ(複数のアプリケーションを管理する)

このままではこのデモアプリケーションしか動作しません
それでは困るので2つ目以降の時の変更点を紹介します。(ここで自分は詰まりました、、)
実際に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はそのままで大丈夫です。(ここでハマりました)

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データベースが作成されているかと思います。

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

最後に

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

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

お疲れ様でした!

Bmouthf
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした