3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バックエンドとフロントエンドがつながっている箇所(実践編)

3
Posted at

はじめに

以前、記載したこちらの記事が結構評判良かったので
バックエンドとフロントエンドがつながっている箇所

今回はその続編となります。

具体的に言うと

「取得したデータが、なぜ {employee.カラム名} のように画面に表示されるのか?」

をより実践的に分解して解説します。

対象者

バックエンドとフロントエンドがつながっている箇所

上記の記事を見て
「参考になった方」または「より実践的なことを学びたい方」

前提

今回は以下の構成をもとに説明したいと思います。

DB構成(例)

employeesテーブル

カラム名 説明
id bigint 主キー
name varchar 氏名
department varchar 部署
position varchar 役職
hire_date date 入社日
created_at timestamp 作成日時
updated_at timestamp 更新日時

モデル

app/Models/Employee.php

use Illuminate\Database\Eloquent\Model;

class Employee extends Model
{
    // 一括代入を許可するカラム
    protected $fillable = [
        'name',
        'department',
        'position',
        'hire_date',
    ];
}

Seeder

app/database/seeders/EmployeeSeeder.php
use App\Models\Employee;

public function run(): void
{
    // テスト用データを1件作成
    $employee = Employee::create([
        'name' => '山田 太郎',
        'department' => '開発部',
        'position' => 'エンジニア',
        'hire_date' => '2022-04-01',
    ]);

}

1. データの流れを整理する

全体の処理フローとしては以下のようになります。

URL (/employees/1)
      ↓
Next.js page.tsx
      ↓
fetchでLaravel APIを呼び出す
      ↓
JSONレスポンスを受け取る
      ↓
employeeオブジェクトに格納
      ↓
JSX内で {employee.カラム名} を表示

2. URLパラメータからデータ取得まで

① URLからIDを取得

app/employees/[id]/page.tsx
export default async function EmployeeDetail({
  params,
}: {
  // URLパラメータの型定義
  params: { id: string };
}) {
  // /employees/1 にアクセスすると id = "1" が入る
  const { id } = params;

/employees/1 にアクセスすると、id = "1" が取得されます。

② Laravel APIを呼び出す

app/employees/[id]/page.tsx
// 社員データを取得する関数
async function getEmployee(id: string): Promise<Employee> {
  const res = await fetch(
  // Laravel APIへHTTPリクエストを送信
    `${process.env.NEXT_PUBLIC_API_BASE_URL}/employees/${id}`,
    { 
    // 常に最新データを取得(キャッシュを無効化)
    cache: "no-store" 
    }
  );

  // ステータスコードが200番台でない場合はエラー
  if (!res.ok) {
    throw new Error("Failed to fetch employee");
  }

  // JSONレスポンスをJavaScriptオブジェクトに変換
  return res.json();
}

ここで実際にバックエンドと通信しています。

③ Laravel側(Controller)

app/Http/Controllers/EmployeeController.php

public function show(string $id)
{
    // idを元にemployeesテーブルから1件取得
    $employee = Employee::findOrFail($id);

    // 取得したデータをJSON形式で返す
    return response()->json($employee);
}

ここがフロントとバックエンドの接続ポイントです。

3. なぜ {employee.カラム名} で値が表示されるのか?

// employeesテーブルのnameカラムを表示
<span>{employee.name}</span>

これは単純に

  {
  "id": 1,
  "name": "山田 太郎",
  "department": "開発部",
  "position": "エンジニア",
  "hire_date": "2022-04-01"
}

という JavaScriptオブジェクトのプロパティを参照しているだけです。
※ fetchで取得したJSONは、res.json()によってJavaScriptオブジェクトに変換されます。

⚠️ 重要
ReactはDBを直接参照しているわけではありません。
Laravelが返したJSONがJavaScriptオブジェクトになっているだけです。

4. つながりの正体

処理フローをより正確に書くと、実際の流れはこうなります。

URL (/employees/1)
↓
Next.jsルーティング
↓
page.tsx実行
↓
fetch(`${process.env.NEXT_PUBLIC_API_BASE_URL}/employees/1`)
↓
Laravel Route
↓
EmployeeController@show
↓
EmployeeモデルでDB取得
↓
JSONレスポンス
↓
JavaScriptオブジェクト化
↓
JSXで描画

フロントエンドとバックエンドがつながっているのは、

👉 API(HTTP通信)

です。

5.TypeScriptの型の役割について

app/employees/[id]/page.tsx
export type Employee = {
  id: number;
  name: string;
  department: string;
  position: string;
  hire_date: string;
};

これにより:

  • どんなデータが返ってくるのか明確になる
  • 存在しないプロパティを参照するとエラーになる
  • 保守性が向上する

というメリットがあります。

6. 今回学んだこと

  • URLパラメータの取得
  • fetchによるAPI通信
  • LaravelのJSONレスポンス
  • JSON → JavaScriptオブジェクト変換
  • JSXでのプロパティ参照
  • TypeScriptによる型安全

まとめ

前回の記事で 「どこでつながっているのか」 を理解しました。

今回はさらに一歩進み

「つながったデータがなぜ {employee.カラム名} として表示されるのか」

まで理解しました。

フロントエンドとバックエンドのつながりは、

  • API通信
  • JSON変換
  • オブジェクト参照
  • JSX描画

という一連の流れで成り立っています。

💡 ポイント
「ただ動いているコード」から「構造を理解したコード」へと変わります。

つまり {employee.カラム名} は「特別な構文」ではなく、
APIから取得したオブジェクトのプロパティを参照しているだけです。

この記事を見て少しでも参考になった方がいらっしゃれば幸いです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?