今回は、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