オリジナルアプリの方向性


# この記事で書くこと

## オリジナルアプリの方向

> バックエンドは、API で投げる

- コントローラーは view と直接やり取りせず、API を返して json で渡す

- 今回は画像を使用しない

- なるはやでお願い

> table と controller を 1:1 のイメージ

- 1 テーブルにつき、1 コントローラーを用意する

- コントローラーごとに、テーブルへの CRUD をまとめる

> 新しい ER 図

![er.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822203/dea8e799-5b68-5c7a-756f-b76ca510c7fb.png)

- 少し悩んでる->SkillDetail の EXP は合計値を保存しておきたい

  - データが大きくなりすぎるかも、経験値 1 億とか大丈夫か

- chatGPT に聞いたら、合計経験値、Level の構成が通常らしい

```SQL
create table players (
  id int,
  name varchar(20),
  total_exp int,
  level int
)
```

- 方向性 -> 現行 ER のまま、exp は合計値、Read 以外で Level を編集する

- Level の初期値は 1 にする

## SkillDetail の CRUD

- chatGPT が基本的な例を教えてくれる

```php:SkillDetailController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SkillDetailController extends Controller
{
    // 一覧取得
    public function index(Request $request)
    {
        // スキルの一覧を取得して返す例
        $skillDetails = SkillDetail::all(); // モデルを使用する場合
        return response()->json($skillDetails);
    }

    // 新規作成
    public function store(Request $request)
    {
        // バリデーション例
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
        ]);

        // データ作成例
        $skillDetail = SkillDetail::create($validated);
        return response()->json($skillDetail, 201);
    }

    // 更新
    public function update(Request $request, $id)
    {
        // バリデーション例
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
        ]);

        // 対象データの更新例
        $skillDetail = SkillDetail::findOrFail($id);
        $skillDetail->update($validated);

        return response()->json($skillDetail);
    }

    // 削除
    public function destroy($id)
    {
        // 対象データの削除例
        $skillDetail = SkillDetail::findOrFail($id);
        $skillDetail->delete();

        return response()->json(['message' => 'Deleted successfully'], 200);
    }
}
```

- php artisan make:controller SkillDetailController --resource で簡単に作れる

- ルーティングは下記で OK

```php
Route::resource('skill-details', SkillDetailController::class);
```

- エンドポイントの確認

```bash
src# php artisan route:list
```

## デプロイ時に気づき

> 間違えは資産である

- だからエラー画面はたくさん覚えている方が強いのだ、焦ってるから撮らないだけ

> The stream or file "/src/storage/logs/laravel.log" could not be opened in append mode:

- 対処

```bash
chmod -R guo+w storage
```

- storage にアクセスできないから権限を与える

> php_network_getaddresses: getaddrinfo for db failed:

- db が名前解決できないらしい

- docker compose up -d ではなく、docker compose up で、db の起動時エラーを確認

```yaml:docker-compose.yaml
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      lower_case_table_names: 1
```

- environment の lower_case_table_names を 1 にしておくほうが良いそう

- 設定を変えた場合、ローカルの db フォルダは rm -rf で完全に消しておく

- 起動後は、以下のどれかが抜けてもエラーになる

```bash
docker compose exec app bash
src# composer install
src# npm install
src# npm run build
src# php  artisan migrate
```

## 暫定

- こちらに

http://ec2-13-230-0-118.ap-northeast-1.compute.amazonaws.com/