LoginSignup
1
0

More than 1 year has passed since last update.

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

Posted at

今回は、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');
    }
}
1
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
1
0