【Laravel】ローカルにLaravelのプロジェクトを作成しページを表示する方法。

ローカルにLaravelのプロジェクトを作成しページを表示する方法。思ってた以上に手軽だった、、


1. [composerのインストール](#1-composerのインストール)
2. [laravelのインストール](#2-laravelのインストール)
3. [laravelサーバーの起動](#3-laravelサーバーの起動)
4. [ディレクトリ構造](#4-ディレクトリ構造)
5. [ルーティングの追加](#5-ルーティングの追加)
6. [ビューの作成とルーティングの変更](#6-ビューの作成とルーティングの変更)
7. [マイグレーションの作成](#7-マイグレーションの作成)
    8. [マイグレーションファイルの構造](#マイグレーションファイルの構造)
    9. [テーブルにカラム追加](#テーブルにカラム追加)
10. [DBにテーブルを作成（sqlite3）](#8-dbにテーブルを作成sqlite3)
11. [テーブルの確認](#9-テーブルの確認)


laravelによるページの表示までなら手順３で完了。３以降は補足。


<br>
##1. composerのインストール
[composerのインストール方法](https://qiita.com/yuta-> 38/items/ca900b5c84e04ff71832)を参照。


<br>
##2. laravelのインストール

```
$ composer create-project laravel/laravel [プロジェクト名] --prefer-dist
```

指定したプロジェクト名でフォルダが作成される。

・`--prefer-dist`オプション
高速ダウンロード用。

このオプションをつけると圧縮されていないファイルを優先してダウンロードする。また、すべてのVSC（バージョン管理ソフト）を取得しないので軽量となる。



<br>
##3. laravelサーバーの起動

`php artisan serve`

```
$ php artisan serve
Starting Laravel development server: http://127.0.0.1:8000
```

表示されたURLにアクセス
`http://127.0.0.1:8000`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/a6d13939-e12e-228f-b649-2536efe33f78.png)

上記画面が表示され完了。

サーバーの終了は`ctrl + c`。


<br>
###（補足）artisanとは？
アルチザンとは職人の意味。
PHPではサーバーの起動やコントローラーを作成したりなど専門的な処理を実行してくれるため職人を意味する`artisan`を使っていると想定される。


<br>
##4. ディレクトリ構造
作成したプロジェクトのディレクトリ構造は以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/b82ac3af-0dc3-c856-1a4a-85cba52cd6cf.png)


<br>
##5. ルーティングの追加
新たに、usersというパスでページを表示できるようにする。

ルーティングか書かれている routes/web.phpを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/3cb31942-2a3f-57df-c252-5045108325fb.png)

コードの最後に以下を追加。

```php:
Route::get('users', function()
{
    return 'Users!';
});
```

これで、http://127.0.0.1:8000/users
にアクセスすると、Users!というテキストが表示される。

>usersというルートが渡されたら、「Users!」を返すという意味。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/80590123-5c40-2435-c489-21c564575836.png)|
|:--|



###（補足）デフォルトのルート

```php:
Route::get('/', function () {
    return view('welcome');
});
```

デフォルトで記載されている上記処理は、ルートパスへの要求がきたら、welcome.blade.phpというファイルを返すという意味。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/b269cc97-9da8-5364-08bb-7355cbb63d27.png)

拡張子`.blade.php`はlaravelにおけるviewファイル。


<br>
##6. ビューの作成とルーティングの変更
自分でビューファイル（.balde.php）を作成し表示してみる。

.balde.phpファイルの中で別の.balde.phpファイルを呼び出すことも可能。今回は、`users.blade.php` の中で`layout.blade.php`を呼び出してみる。

ビューファイルは、resources/viewsフォルダ配下に設置する。

```php:layout.blade.php
<html>
    <body>
        <h1>Laravelクイックスタート</h1>

        @yield('content')
    </body>
</html>
```

```php:users.blade.php
@extends('layout')

@section('content')
    Users!
@stop
```

`@`がつく記述をディレクティブとよび、HTMLと同時に記述することでphpを実行することができる。

・`@extends('layout')`
ビューの拡張。layout.blade.phpを呼び出す。

・`@section('セクション名')` 内容 `@stop`
セクションの作成。
引数内の変数に値を代入する処理。`@yield('セクション名')`で定義したセクションの内容を読み込むことができる。

セクションの終わりは`@stop`で指定（必須）。エイリアスである`@endsection`でもOK。


<br>
作成したビューファイルを表示するようにルーティングを変更する。

先ほどのusesのルーティングの戻り値を`view('ビューファイル名')`とする。

```php:
Route::get('users', function()
{
    return view('users');
});
```

<br>
以上で作成したビューファイルを表示できる。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/fe2c8cc3-e80f-c00a-dfc9-ad57d0ae4cf7.png)|
|:--|



<br>
##7. マイグレーションファイルの作成
Laravelで**DBを扱うために必要なマイグレーションファイル**を作成する。

>laravelはマイグレーションファイルの内容を元にDB操作を行う。
マイグレーションファイルにはDBで使用するカラムの定義が入る。

・`php artisan make:migration create_[テーブル名]_table`

```
$ php artisan make:migration create_flights_table
Created Migration: 2021_01_12_055029_create_flights_table
```

実行すると、database/migrationsフォルダ配下に指定したテーブル名のマイグレーションファイルが作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/0b2adc59-7fb8-08c0-9ede-0950ffe90a91.png)

作成した**マイグレーションファイル名はクラス名に直結**する。

```php:yyy_mm_dd_sec_create_flights_table.php
class CreateFlightsTable extends Migration
```


<br>
###create_と_tableの意味
ちなみに、先頭と末尾の`create_`と`_table`はなくてもマイグレーションファイルを作成できる。

```:例
$ php artisan make:migration test
Created Migration: 2021_01_12_060050_test
```

作成したファイルがマイグレーションファイルであることを明示的に示すために`create_テーブル名_table`とするのが一般的。


<br>
###マイグレーションファイルの構造
マイグレーションファイルには指定したテーブル名の**クラス**（移行クラスと呼ぶ）が作成され、中に**upとdownの２つのメソッド**が用意される。


・upメソッド： 
　DBにテーブルやカラムを追加するメソッド。

・downメソッド：
　以前の状態に戻すメソッド。


```php:マイグレーションファイルの中身
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateFlightsTable extends Migration
{
    //マイグレーションの実行
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    //マイグレーションを戻す
    public function down()
    {
        Schema::dropIfExists('flights');
    }
}
```


<br>
###upメソッドの中身

```php:
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }
```


Schemaファサードを使ってcreateメソッドを実行し、カラムにidとタイムスタンプをもつテーブルflightsを作成する処理となる。

・`Blueprint`
テーブルにカラムやインデックスを追加するために使用するインスタンス。

・`$table`
テーブルの名前が入った変数



<br>
####ファサードとは
ファサードとはクラスの中のメソッドをインスタンスを呼び出さずに実行できる機能。

使用する**メリットはコードを単純化できる**こと。

・`use Illuminate\Support\Facades\ファサード名;`
冒頭に記述してファサードを使えるようにする。

ファサードの本来の意味は「建物の正面」。人まとまりのプログラミングを建物とすると、その建物全てを用意せずとも、正面さえ用意すればそのプログラムが使えるようにすると言ったところ。

**▼主なファサード**
Schema以外にも、Route, Session, Request, Viewなどがある。

[Laravel公式 ファサードの詳細](https://laravel.com/docs/5.4/facades#facade-class-reference)


<br>
####ヘルパー関数とファサードの違い
ファサードと似た処理でヘルパー関数がある。
ヘルパー関数はファサードを更に縮めたコード。

**▼ビューファイルの呼び出し**
profile.blade.phpを呼び出す場合、以下２つは同じ処理になる。

・Viewファサードでmakeメソッドを使う
`return View::make('profile');`

・ヘルパー関数を使う
`return view('profile');`

ファサードを使うよりヘルパー関数を使う方がわかりやすい。


##テーブルにカラム追加
Schemaファサードのcreateメソッドを使って、テーブルにカラムを追加することができる。

・`$table->型('カラム名')->カラム修飾子()`

```php:
    public function up()
    {
        Schema::create('flights', function (Blueprint $table) {
            $table->id();
            $table->string('name')->unique();
            $table->string('email')->nullable();  
            $table->integer('age');
            $table->boolean('membership')->default(false);      
            $table->timestamps();
        });
    }
```

ユーザー情報用に、name, email, age, membeshipを追加。
必要に応じてカラム修飾子をつける。

###カラム修飾子
指定したカラムに条件を追加する。

**・nullable()**
nullを許容する。

**・default($value)**
デフォルト値を指定する。


型とカラム修飾子はかなりの種類がある。一覧は[laravel公式ページ](https://readouble.com/laravel/8.x/ja/migrations.html#creating-tables)を参考。



###インデックス修飾子
カラム修飾子と似ている。型に条件を追加する。
主キーや重複の禁止を指定できる。

上記設定では、`unique()`が該当。



<br>
##8. DBにテーブルを作成（sqlite3）
laravelとDBを接続する。
簡易的なテストのためDBはsqlite3を使用。（macは標準インストール済み）

###step1. .envファイルの変更

```:.env（変更前）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
```

↓　以下に変更

```:.env（変更後）
DB_CONNECTION=sqlite
```

<br>
###step2. database.sqliteの作成
database/database.sqliteを作成する。

プロジェクトのルートディレクトリで以下を実行。

```
$ touch database/database.sqlite
```


<br>
###step3. マイグレーションの実行

・`php artisan migrate`
作成したマイグレーションファイルをベースにDBにテーブルを作成する。


```
$ php artisan migrate:refresh
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (2.46ms)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.98ms)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table (0.84ms)
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (1.82ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (1.36ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (1.36ms)
Migrating: 2021_01_12_074652_create_flights_table
Migrated:  2021_01_12_074652_create_flights_table (1.38ms)
```

以上でDBの作成が完了。


###マイグレーションファイルを変更したとき
マイグレーションファイルを変更した場合は、`refresh`をつけて実行する。

・`$ php artisan migrate:refresh`


##9. テーブルの確認
マイグレーションでDBに正しくテーブルが作成できたか確認する。

・`sqlite> .table`

```
#sqlite3を起動
$ sqlite3
SQLite version 3.28.0 2019-04-15 14:49:49
Enter ".help" for usage hints.

#テーブル一覧を表示
sqlite> .table
failed_jobs      password_resets  users
migrations       flights
```