274日目 PHP(laravel)が分かってきた社畜L_part1

## はじめに
### laravel？だからなに？
なりますよね？私もそうでした。
簡単に言うと**開発に使えそうな機能いろいろ詰め込んだやつ**です。
使い方(書き方)を知っていれば簡潔にコードをかけますが、何も知らずにプロジェクト入ると…
**なんでこれでデータ取れてるのかわからない！コード追っても意味わからん！** となります(なりました)。

そんなこんなで、laravelを触り始めてから１か月半が立ちました。
今回はこの期間内で私が学んだことについてまとめていこうと思います。
（環境構築手順については長くなるのでこの場では割愛します。）

これからlaravel始めるって方の参考になれば幸いです。


### 用語紹介
| 用語 | 解説 |
|-----------|------------|
| **フレームワーク** | ソフトウェア開発を効率化するための便利なツールやライブラリ、設計の集合体|
| **ルーティング**   | ユーザーからのリクエストを処理するためにURLとコントローラーやアクションを結びつける仕組みのこと。 |
| **コントローラー** | ルーティングから渡されたリクエストを処理し、適切なデータやビューを返す役割を持つファイル。`app/Http/Controllers`ディレクトリに配置される。 |
| **モデル**       | データベースとのやり取りを管理する役割を持つファイル。データの取得、挿入、更新、削除を行えます。`app/Models`ディレクトリに作成される。 |
| **ビュー**       | ユーザーに表示されるHTMLなどの出力を管理するファイル。Bladeテンプレートエンジンを使用して、`resources/views`ディレクトリ内に配置される。 |
| **マイグレーション** | データベーススキーマをバージョン管理するための仕組み。コマンドを使ってテーブルやカラムの作成、変更、削除を管理する。`database/migrations`に作成される、コマンドにより動作する。 |
| **リレーション**   | データベーステーブル間の関連性を定義する機能。関係をクラス内で表現し、簡単に関連データを取得するための仕組み。 |


## 基本構成と作成手順

基本構成は以下ファイルとなっており、順に説明していきます。
- ルーティングファイル：web.php
- コントローラーファイル：○○Controller.php
- モデルファイル：○○.php
- マイグレーションファイル：yyyy_mm_dd_hhmmss_{クエリコマンド}_{テーブル名}.php

## :point_up:step1：ルーティングファイル
#### :point_right:概要
**該当ファイル：web.php**
全てはここから始まります。
なんかかっこつけたこと言いましたが、**このURLだったらこの処理してね** という振り分けを行うためのファイルです。
基本的に「/routes/web.php」に存在しています。

#### :point_right:設定方法
新しいルーティングを作成する際は、以下①②のように定義を追記します。
step2のコントローラファイルを作成した後にここの定義を書きに来るのが良いですね。
```php
<?php
use Illuminate\Support\Facades\Route;

// ⓵ ルーティング先のコントローラーを宣言
// どこのファイルに記載してある処理を行わせたいか宣言します。
use App\Http\Controllers\[ファイル名];

// ⓶ ルーティング情報を記載
// どういうパスの時に、どこのファイルの、どの処理を行うかを記載します。
Route::get('{リクエストパス}', [{ルーティング先コントローラー}::class, '{ルーティング先メソッド}']);
```

## :point_up:step2：コントローラーファイル
#### :point_right:概要
**該当ファイル形式：○○Controller.php**
処理の本体部分です。受け取った情報をモデルやビューで処理するように指示するファイルです。
またビューに渡す情報の成形も行います。

#### :point_right:作成方法
下記コマンドを実行することで、コントローラーファイルが「/app/Http/Controllers」ディレクトリ内に自動生成されます。
```php
// 注）ファイル名はControllerでしめる
// 例）php artisan make:controller test/TestController
php artisan make:controller {任意の名前}
```

#### :point_right:ファイル作成後に行う設定

1. 利用するファイルを宣言します↓
    ```php
    <?php
    namespace App\Http\Controllers;
    
    // 後述のモデルや他のコントローラファイルを参照する場合宣言します。
    use [利用するファイルのフルパス];
    ```
    <br>

2. 必要なメソッドを作成します↓
    ```php
    class TestController extends Controller
    {
        // 必要な分だけここにメソッドを定義していく
        public function exampleFunc1(引数)
        {   
            (処理)
        }

        public function exampleFunc2(引数)
        {
            (処理)
        }

        　・
        　・
        　・
    }
    ```
    <br>

3. ルーティング設定
    step1を参考に、web.phpにルーティング先のコントローラーを宣言やルーティング情報を記載します。

## :point_up:step3：モデルファイル
#### :point_right:概要
**該当ファイル形式：○○.php**  特に"model"とかは付いていない...
DBへの連携を行うためのファイルです。
DBのテーブル１つにつき１つのファイルを作成します。

#### :point_right:作成方法
下記コマンドを実行することで、モデルファイルが「/app/Models」ディレクトリ自動生成されます。
```php
// 注）パスカルケースで書く
// 例）php artisan make:model test/TestUser
php artisan make:model {任意の名前}
```

**⚠参照ルール**
ここが難しいところですが、モデルファイルは作成された名前をもとにしたテーブルを自動で参照しようとします。

例
「TestUser」というモデルファイルは「test_users」というテーブルを自動で参照します。

#### :point_right:ファイル作成後に行う設定
特に無しです。名前さえ正しく設定できていれば特に追加設定なく対象テーブルに接続できます。


## :point_up:step4：マイグレーションファイル
#### :point_right:概要
**該当ファイル形式：yyyy_mm_dd_hhmmss_{クエリコマンド}_{テーブル名}.php** 
テーブルの作成や編集、削除などを管理するファイルです。
これを作成し実行することでDBに新しいテーブルが作成されたり、新たに条件の追加等ができます。

#### :point_right:作成方法
下記コマンドをそれぞれ必要に応じて実行することで、マイグレーションファイルが「/database/migrations」ディレクトリに自動生成されます。
```php
// テーブル作成用
php artisan make:migration create_{テーブル名}_table

// テーブル変更用
php  artisan make:migration change_column_type_{属性を変更したいカラム名}_to_{テーブル名}_table --table={テーブル名}

// カラム削除用
php artisan make:migration drop_column_{削除したいカラム名}_column --table={テーブル名}
```

#### :point_right:ファイル作成後に行う設定
up()には正常処理を書き、down()にはロールバック処理を書きます。
ロールバック処理は、正常処理を打ち消す内容で書くようにします。

- テーブル新規作成時のもの↓
```php
public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        // これは変更しない
        $table->id();
        
        /**  $tableに続けて追記
            *
            *  例
            *  $table->string('text');
            *  $table->string('image', 50);
            *  $table->timestamps();
            */
    });
}
// こっちには触らない
public function down(): void
```
- テーブル変更時のもの↓
```php
public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        // 新規登録
        $table->string('name');
        $table->string('e-mail', 50);
        // 場所を指定する場合(例はtextカラムの後ろにauthorカラム追加)
        $table->string('author')->after('text');
    });
}
// こっちにも追記
public function down(): void
{
    Schema::table('posts', function (Blueprint $table) {
        // カラムを削除
        $table->dropColumn(['name', 'e-mail','author']);
    });
}
```
- カラム削除時のもの↓
```php
public function up(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('content'); // 'content' カラムを削除
    });
}

public function down(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->text('content')->nullable(); // 'content' カラムを再追加
    });
}
```

up(),down()の処理を書いたら、それぞれ以下マイグレーションコマンドで実行できます。
```
// マイグレーション実行（正常処理）
php artisan migrate

// マイグレーション実行（ロールバック）※正常処理成功したものを亡き者にしたいときに。
php artisan migrate:reset

// マイグレーション実行（実行済の正常処理をすべてロールバックし、正常処理をすべてやり直す）
php artisan migrate:refresh
```


## :v:おまけ
step2~4でやったファイル作成は下記コマンドでいっぺんにやることも可能です。
モデルファイル, マイグレーションファイル, コントローラーファイルをいっぺんに同時生成し、3者の参照設定もいい感じにやってくれます。
```php
// 注）末尾にsは付けず、かつパスカルケースでかく 
// 例）php artisan make:model test/TestUser -mc
php artisan make:model {任意の名前} -mc
```
ただし、step1でやったルーティング設定は自動で行ってくれないので手動でやるのをお忘れなく。

便利ではあるのですが、流れを掴むためにはstep1~4の通り順番に作成していくのがオススメです。


## まとめ
今回はlaravelの基本的な構成について説明しました。
次回はマイグレーション、リレーション等のもう少し深い話をしていきたいと思います‼

私もまだまだ勉強したてですが、さすがにlaravelは一番使われているだけあって
噛めば噛むほど味があって面白いです‼