docker-composeを利用して、Laravelで最もシンプルなWeb APPを作る。

今回は、Laravelで最もシンプルなBlogのようなAPPの作り方を記載する。
ログインなどの認証機能などの機能もない、ただデータベースに記事を登録、編集、削除できるだけの機能となっている。
dockerfile
```
# ベースイメージを指定
FROM php:8.1-fpm

# 必要なパッケージをインストール
RUN apt-get update && \
    apt-get install -y git curl zip unzip libpq-dev && \
    apt-get install -y sudo && \
    docker-php-ext-install mysqli pdo pdo_mysql && \
    curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Laravelをインストール
RUN composer global require laravel/installer
ENV PATH="~/.composer/vendor/bin:$PATH"
RUN composer create-project --prefer-dist laravel/laravel /var/www/html

# Install required packages
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*


# プロジェクトディレクトリに移動
WORKDIR /var/www/html/Myblog

# ポートを公開
EXPOSE 9000

# アプリケーションを起動 
CMD ["php", "artisan", "serve", "--host=0.0.0.0", "--port=9000"]
#docker run -p 9000:9000 t0307_web php artisan serve --host=0.0.0.0 --port=9000
```
docker-compose.yml
```
version: "3"
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: web
    ports:
      - "8000:9000"
    volumes:
      - .:/var/www/html
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_DATABASE: blog
      DB_USERNAME: user
      DB_PASSWORD: pass
  db:
    image: mysql:5.7
    container_name: mysql
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: blog
      MYSQL_USER: user
      MYSQL_PASSWORD: pass
volumes:
  db_data:

```

- dockerでの開発環境準備
webコンテナ内に入る
`docker-compose exec web bash`
mysqlコンテナ内に入る
`docker exec -it mysql bash`
`mysql -u root -p`

-  Laravelのインストール
Laravelをインストールするためには、Composerを使用する。
まずはComposerをインストールし、次にターミナルで以下のコマンドを入力する。
`composer create-project --prefer-dist laravel/laravel AppName`
※今回はAppNameはMyBlogとする。
これにより、Laravelの最新バージョンがインストールされる。

-  データベースの設定
LaravelでBLOGのようなWEBアプリケーションを作成する場合、データベースが必要である。
データベースを設定するために、.envファイルを編集する。
``` 
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=blog
DB_USERNAME=root
DB_PASSWORD=pass 
```
- マイグレーション実行(データベーステーブルの作成)
Laravelでは、マイグレーションを使用してデータベースのテーブルを作成できる。
    - マイグレーションファイルの作成
ターミナルで以下のコマンドを入力する。
新しいマイグレーションファイルを作成するコマンド
`php artisan make:migration create_posts_table --create=posts`
マイグレーションファイルは、database/migrationsディレクトリに作成する。

    - マイグレーションファイルの編集
create_posts_table.phpのfunction upを変更する。
    ```
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->timestamps();
        });
    }　
    ```

    - マイグレーションを実行する
`php artisan migrate`
※ルートディレクトリで実行する必要がある。
SQLの中に新たなPOSTSテーブルが作成される。
- モデルを設定する
    - モデルファイルを作成する 
モデルは、データベースとアプリケーションの間のインターフェースである。
以下のコマンドを実行して、Postモデルを作成する。
`php artisan make:model Post`
Models/post.phpができる。
    - モデルファイルを設定する。
Postクラス内にカラムに対応するプロパティを設定する。
``` 
class Post extends Model
{
    use HasFactory;
    protected $fillable = ['title', 'content', 'created_at', 'updated_at'];
}
```
- ルーティングの設定
routes/web.phpにルーティングを追記する。
``` 
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create');
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->name('posts.edit');
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy');
Route::put('/posts/{post}/update', [PostController::class, 'update'])->name('posts.update');
Route::post('/posts', [PostController::class, 'store'])->name('posts.store');
```
- コントローラを設定する。
   - コントローラーファイルを作成する。
   `php artisan make:controller PostsController`
app/Http/Controllers ディレクトリ内にファイルが作成される。
    - コントローラのアクションを定義する
   PostsController.phpを編集する。
```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        // 全ての記事を取得する。
        $posts = Post::all();
    
        // 記事一覧を表示するためのビューに、取得した記事一覧を渡す。

        return view('posts.index', compact('posts'));
    }    

    public function test()
    {
        return view('test.test');
    }    


    public function create()
    {
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $post = new Post();
        $post->title = $request->input('title');
        $post->content = $request->input('content');
        $post->created_at = now();
        $post->updated_at = now();
        $post->save();
        return redirect()->route('posts.index');
    }
    
    public function show($id)
    {
        $post = Post::findOrFail($id);
        return view('posts.show', compact('post'));
    }
    

    public function edit($id)
    {
        $post = Post::findOrFail($id);
        return view('posts.edit', compact('post'));
    }
    

    public function update(Request $request, $id)
    {
        $post = Post::findOrFail($id);
        $post->title = $request->input('title');
        $post->content = $request->input('content');
        $post->updated_at = now();
        $post->save();
        return redirect()->route('posts.show', $post);
    }
    

    public function destroy($id)
    {
        $post = Post::findOrFail($id);
        $post->delete();
    
        return redirect()->route('posts.index');
    }
}
```
- ビューを作成する
ここは割愛する。
コードはGitHUBの確認ください。
https://github.com/masayawatanabe0218/simpleLaravelApp