LaravelでAPIをサクッと作成するための指南書

# サクッとLaravelでAPIを作る

```
作成日: 20240625
最終更新日: 20240626
```
## 前提
初学者が超簡易的なAPIを作成してみるをテーマにしたレベル感
PHPとcomposerの環境構築がされていること
DBサーバーを仮想環境やローカルに構築済みであること

## 目次

- [サクッとLaravelでAPIを作る方法](#サクッとlaravelでapiを作る方法)
  - [前提](#前提)
  - [目次](#目次)
- [Laravelプロジェクトの作成](#laravelプロジェクトの作成)
- [envの設定](#envの設定)
  - [トラブルシューティング](#トラブルシューティング)
- [Modelの作成](#modelの作成)
  - [ソース例](#ソース例)
- [Controllerの作成](#controllerの作成)
- [ルーティングの設定(api.php)](#ルーティングの設定apiphp)
- [ここまでこれたらAPI完成](#ここまでこれたらapi完成)
- [番外編: エラーで困ったらとりあえずキャッシュクリア](#番外編-エラーで困ったらとりあえずキャッシュクリア)
  - [それでも解決しないときはlaravel.logを見る](#それでも解決しないときはlaravellogを見る)
- [あとがき](#あとがき)

# Laravelプロジェクトの作成
``` powershell
composer create-project laravel/laravel {プロジェクト名} --prefer-dist "{バージョン}.*"   
```
- 例
``` powershell
composer create-project laravel/laravel TestProject --prefer-dist "10.*"   
```

# envの設定
- これを自分の環境に合わせて書き換える
``` 
DB_CONNECTION=
DB_HOST=
DB_PORT=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
```
- 例
```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=TestDB
DB_USERNAME=TestUser
DB_PASSWORD=TestPassword
```

## トラブルシューティング
envファイルが存在しないなどの問題が発生した場合は下記記事を参照
- https://qiita.com/rioLi0N/items/317bdffbafba837635b1

# Modelの作成
``` powershell
php artisan make:model {Model名}
```
- 例
```
php artisan make:model TestModel
```

## ソース例

``` php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class TestModel extends Model
{
// DB接続定義
// Eloquentモデルでは、明示的にtableプロパティでテーブル名を指定しない限りは、モデル名を複数系のスネークケースにしたものがテーブル名として使用される
    protected $table = "test_table"; // DBに存在するテーブル名を設定する必要があります
// Eloquentモデルでは基本的に主キーをidというカラムであることを想定している。主キーをid以外のカラムに指定したいとき(オーバーライドしたいとき)にはprotectedのprimaryKeyプロパティを定義する。
    protected $primaryKey = "test_id"; // テーブルに存在する主キー名を設定する必要があります
    public $incrementing = true; // オートインクリメントを自動でやってくれるかどうか
    
    // タイムスタンプの挿入を自動でやってくれるかどうか
    // 監査列を改竄される可能性を減らすためにも自動挿入したほうがいい
    // created、updatedのように過去形のカラム名にしないと自動挿入できない
    // タイムゾーンの設定はcofig/app.phpから(デフォルトはUTC)
    // 設定してもタイムゾーンが変更されないときはキャッシュを削除してから再生成
    public $timestamps = true; 
    
    // 1つの操作で複数の属性を一度に設定するためにはfillableにしないといけない
    // 例えば下記の処理では一度にTestColumnOneとTestColumnTwoという複数の属性を更新しようとしている
    // $dataToUpdate = $request->only(['TestColumnOne', 'TestColumnTwo']);
    // $columns->update($dataToUpdate);
    protected $fillable = ['TestColumnOne','TestColumnTwo']; 
    }
```

# Controllerの作成
Route::apiResourceに対応するControllerを作成しています<br>
- 参考: https://zenn.dev/naoki_oshiumi/articles/8fc5b9d20bcc89
``` powershell
php artisan make:controller {Controller名} --api 
```
``` powershell
php artisan make:controller TestController --api 
```

# ルーティングの設定(api.php)
今回はapi.phpにルーティングを設定します。
web.phpでもルーティングできるけどCSRF保護が有効になってるからそこは注意かな
```php
// apiResourceのルーティングはコントローラに定義した関数名と連動する
// ルーティングルートの/api/はapi.phpでルーティングすると省略される(プレフィックスが設定されている)
// この場合、実際のURLはapi/testなので注意
// プレフィックスを変更する場合の参考記事:  https://engineer-jose-blog.com/%E3%80%90laravel9%E3%80%91api%E3%81%AEurl%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%EF%BC%88%E6%8E%A5%E9%A0%AD/
Route::apiResource('test', TestController::class);
```

# ここまでこれたらAPI完成
後は、ModelとControllerの中身を用途に応じで変更すればAPIとして使えますね！
バリデーションとかBearer認証の実装方法とかは別記事を参照してくれ！

# 番外編: エラーで困ったらとりあえずキャッシュクリア
「 ; 」または「 && 」でコマンドを同時実行できるようにしてるのでまとめてコピペしてください<br>
- Windows
``` powershell
del bootstrap/cache/* ;
php artisan cache:clear ;
php artisan config:clear ;
php artisan route:clear ;
php artisan view:clear ;
php artisan clear-compiled ;
php artisan optimize ;
del bootstrap/cache/config.php ;
composer dump-autoload 
```
- Linux＆MAC
``` powershell
rm bootstrap/cache/* &&
php artisan cache:clear &&
php artisan config:clear &&
php artisan config:cache &&
php artisan route:clear &&
php artisan view:clear &&
php artisan clear-compiled &&
php artisan optimize &&
rm -f bootstrap/cache/config.php &&
composer dump-autoload
```

## それでも解決しないときはlaravel.logを見る
storage/logs/laravel.log

# あとがき
細かいことはいいからササっとAPI作成する方法をよこせって実体験があったので
この記事を書いてみました！
説明不足だなとか問題が発生したらコメントなどで連絡してもらえば答えます！

よかったらTwitterフォローしてね！
フォロバしまっす！

https://twitter.com/rioLi0N