PHP LaravelでRESTful APIを試す

## はじめに
Larvel PHPでRESTful APIのテストをしたときの備忘録です。CRUDの内容は参考URLの通り。

Laravel8で実施しようかとやろうと思いましたが、Laravel10でも同じ書き方でできるのかなと思い、テスト的にLaravel10で実施しています。

## 環境

・Windows11, XAMPP PHP v8.2
・composerのインストール（EXEファイルによりインストール）

https://getcomposer.org/

~~~ powershell:PowerShell
$ php -V
PHP 8.2.12

$ composer -V
Composer version 2.7.1
~~~

## Laravel10 インストール

・Laravel10のインストール
~~~ powershell:PowerShell
$ composer create-project "laravel/laravel=10.*" --prefer-dist (フォルダ名)
~~~

・実行して確認してみる
~~~ powershell:PowerShell
$ cd (フォルダ名)
$ php artisan serve
~~~

・http://127.0.0.1:8000/
にアクセスして確認する

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/014bb21e-a339-914c-314e-19fd5bc67d9c.png)


## DBの作成
・XAMPP phpmyadmin でDBを新規に作成

## モデル
・make model
~~~ powershell:PowerShell
$ php artisan make:model Student -m
~~~

・app/modelsのStudent.phpを編集

~~~ Student.php
<?php

namespace App\Models;

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

class Student extends Model
{
    use HasFactory;

    protected $table = 'students';

    protected $fillable = ['name', 'course'];

}
~~~

## マイグレーション
・database/migrationsのファイルを編集
~~~ yyy_mm_dd_xxxx_create_xxx.php
<?php

    public function up(): void
    {
        Schema::create('students', function (Blueprint $table) {
            // $table->id();
            // $table->timestamps();
            $table->increments('id');
            $table->string('name');
            $table->string('course');
            $table->timestamps();
        });
    }
~~~

 .envファイルを編集

~~~ .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=(新規作成したDBを指定)
DB_USERNAME=root
DB_PASSWORD=
~~~

・マイグレーション
~~~ powershell:PowerShell
$ php artisan migrate
~~~

・phpmyadminにてDBの中身を確認
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/9e732912-2cfc-34e6-2db3-91f2c53e3bc6.png)

## ルーティング

・make controller
~~~ powershell:PowerShell
$ php artisan make:controller ApiController
~~~

・app/Http/controllersの ApiController.phpの編集

~~~ ApiController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

#追加
use App\Models\Student;

class ApiController extends Controller
{
        // logic to get all students goes here
        public function getAllStudents() {
            $students = Student::get()->toJson(JSON_PRETTY_PRINT);
            return response($students, 200);
        }

        // logic to create a student record goes here
        public function createStudent(Request $request) {
            $student = new Student;
            $student->name = $request->name;
            $student->course = $request->course;
            $student->save();

            return response()->json([
                "message" => "student record created"
            ], 201);
        }

        // logic to get a student record goes here
        public function getStudent($id) {
            if (Student::where('id', $id)->exists()) {
                $student = Student::where('id', $id)->get()->toJson(JSON_PRETTY_PRINT);
                return response($student, 200);
            } else {
                return response()->json([
                    "message" => "Student not found"
                ], 404);
            }
        }

        // logic to update a student record goes here
        public function updateStudent(Request $request, $id) {
            if (Student::where('id', $id)->exists()) {
                $student = Student::find($id);
                $student->name = is_null($request->name) ? $student->name : $request->name;
                $student->course = is_null($request->course) ? $student->course : $request->course;
                $student->save();

                return response()->json([
                    "message" => "records updated successfully"
                ], 200);
                } else {
                return response()->json([
                    "message" => "Student not found"
                ], 404);
            }
        }

        // logic to delete a student record goes here
        public function deleteStudent ($id) {
            if(Student::where('id', $id)->exists()) {
                $student = Student::find($id);
                $student->delete();

                return response()->json([
                    "message" => "records deleted"
                ], 202);
            } else {
                return response()->json([
                    "message" => "Student not found"
                ], 404);
            }
        }
}
~~~

・routes/api.phpの編集
ApiControllerにて作成済みのメソッドを参照するエンドポイントを作成

~~~ api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

#追加
use App\Http\Controllers\ApiController;

Route::get('/students', [ApiController::class, 'getAllStudents']);
Route::post('/students', [ApiController::class, 'createStudent']);
Route::get('/students/{id}', [ApiController::class, 'getStudent']);
Route::put('/students/{id}', [ApiController::class, 'updateStudent']);
Route::delete('/students/{id}',[ApiController::class, 'deleteStudent']);
~~~

・ルートの確認

~~~ powershell:PowerShell
$ php artisan route:list

GET|HEAD  api/students ....................... ApiController@getAllStudents
POST      api/students ....................... ApiController@createStudent
GET|HEAD  api/students/{id} .................. ApiController@getStudent
PUT       api/students/{id} .................. ApiController@updateStudent
DELETE    api/students/{id} .................. ApiController@deleteStudent
~~~

## テストの実施

POSTMANにてテストを行う

https://www.postman.com/

- POST: データを登録する

Post：http://127.0.0.1:8000/api/students

BodyとNameをいれてSendし、record createdが返ってくる。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/827b1810-0f3d-003f-1e24-efc0bc7ba132.png)

- GET: データを取得する

GET：http://127.0.0.1:8000/api/students
GET：http://127.0.0.1:8000/api/students/2  ←IDによるデータ取得

登録されているすべてのレコードが取得できる。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/cfa21f98-22bc-16e2-55af-d5b236699732.png)

- PUT変更する　PUT

PUT：http://127.0.0.1:8000/api/students/3

JSON形式でPUTを送りデータを更新する。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/392f22de-8d60-3d12-2c84-4cc5af085895.png)

- DELETE: 削除する

GET：http://127.0.0.1:8000/api/students/2

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/9bd96133-2316-c104-d080-2865d01c54e4.png)

## 参考URL

https://www.twilio.com/ja/blog/building-and-consuming-a-restful-api-in-laravel-php-jp