1. ルーティングの名前定義
ルーティングとは、特定のURLパターンに対して特定のアクションを実行するように設定することです。名前付きルートは、ルートに名前をつけて、それを使って簡単にURLを生成する方法です。
なぜ名前を定義するのか?
- 可読性: コードが読みやすくなります。
- メンテナンス: URLが変わっても、ルート名を使えば変更が容易です。
- DRY原則: 同じURLを繰り返し書くことを避けられます。
例 (Laravelの例):
// routes/web.php
Route::get('user/profile', 'UserController@showProfile')->name('profile');
// 名前付きルートを使ってURLを生成
$url = route('profile');
他のフレームワークでの例:
-
Rails:
get 'profile', to: 'users#show', as: 'profile'
-
Django:
from django.urls import path from . import views urlpatterns = [ path('profile/', views.profile, name='profile'), ]
2. MVCとは
MVCは、Model-View-Controllerの略で、ソフトウェア設計パターンの一つです。主にユーザーインターフェースの構築に使用されます。
各要素の役割:
- Model: データとビジネスロジックを扱います。
- View: ユーザーインターフェースを扱います。データの表示に関する部分です。
- Controller: ModelとViewの間のインターフェースを扱います。ユーザーからの入力を受け取り、それに応じてModelやViewを操作します。
MVCの利点:
- 分離: コードの役割が明確に分離され、理解しやすくなります。
- 再利用性: 各コンポーネントが独立しているため、再利用が容易です。
- メンテナンス性: 変更が特定のコンポーネントに限定されるため、メンテナンスが容易です。
MVCの例 (Rails):
# Model
class User < ApplicationRecord
end
# Controller
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
end
# View (show.html.erb)
<%= @user.name %>
3. CRUDとは
CRUDは、Create, Read, Update, Deleteの略で、データ操作の基本的な4つの操作を指します。
CRUD操作:
- Create: 新しいデータを作成する操作。
- Read: 既存のデータを読み取る操作。
- Update: 既存のデータを更新する操作。
- Delete: 既存のデータを削除する操作。
CRUDの例 (Django):
from django.shortcuts import render, get_object_or_404
from .models import Item
# Create
def create_item(request):
if request.method == 'POST':
form = ItemForm(request.POST)
if form.is_valid():
form.save()
return redirect('item_list')
else:
form = ItemForm()
return render(request, 'item_form.html', {'form': form})
# Read
def item_list(request):
items = Item.objects.all()
return render(request, 'item_list.html', {'items': items})
def item_detail(request, pk):
item = get_object_or_404(Item, pk=pk)
return render(request, 'item_detail.html', {'item': item})
# Update
def update_item(request, pk):
item = get_object_or_404(Item, pk=pk)
if request.method == 'POST':
form = ItemForm(request.POST, instance=item)
if form.is_valid():
form.save()
return redirect('item_detail', pk=item.pk)
else:
form = ItemForm(instance=item)
return render(request, 'item_form.html', {'form': form})
# Delete
def delete_item(request, pk):
item = get_object_or_404(Item, pk=pk)
if request.method == 'POST':
item.delete()
return redirect('item_list')
return render(request, 'item_confirm_delete.html', {'item': item})
4. バリデーション実装
バリデーションは、ユーザーからの入力データが正しいかどうかを確認するプロセスです。
なぜバリデーションが必要か?
- セキュリティ: 不正なデータ入力を防ぎます。
- データ整合性: データベース内のデータが正確であることを保証します。
- ユーザー体験: ユーザーに対して適切なフィードバックを提供します。
バリデーションの例 (Laravel):
// Controller内のバリデーション
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
// バリデーションが成功した後の処理
$article = new Article($validatedData);
$article->save();
return redirect('articles');
}
他のフレームワークでのバリデーション:
-
Rails:
class User < ApplicationRecord validates :name, presence: true, length: { maximum: 50 } validates :email, presence: true, uniqueness: true end
-
Django:
from django import forms class ItemForm(forms.ModelForm): class Meta: model = Item fields = ['name', 'description'] def clean_name(self): name = self.cleaned_data.get('name') if len(name) < 5: raise forms.ValidationError("Name must be at least 5 characters long") return name
5. CSRF対策
CSRF (Cross-Site Request Forgery)は、悪意のあるサイトがユーザーの認証情報を利用して意図しない操作を実行させる攻撃手法です。
なぜCSRF対策が必要か?
- セキュリティ: ユーザーのセッションを保護します。
- データの安全性: 不正なデータ操作を防ぎます。
CSRF対策の実装方法:
- トークンの使用: フォーム送信時にトークンを埋め込み、サーバー側で検証します。
CSRF対策の例 (Django):
# settings.py
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware',
# その他のミドルウェア
]
# テンプレート内
<form method="post">
{% csrf_token %}
<!-- フォームフィールド -->
</form>
他のフレームワークでのCSRF対策:
-
Laravel:
// テンプレート内 <form method="POST" action="/example"> @csrf <!-- フォームフィールド --> </form>
-
Rails:
# application_controller.rb class ApplicationController < ActionController::Base protect_from_forgery with: :exception end # テンプレート内 <%= form_with url: '/example', method: 'post' do |form| %> <%= form.hidden_field :authenticity_token, value: form_authenticity_token %> <!-- フォームフィールド --> <% end %>
次のステップとして、実際のコードを動かしてみて、バリデーションやCSRF対策が正しく機能しているか確認してみます。
以下に、実際のコードを動かしてみて、バリデーションやCSRF対策が正しく機能しているか確認する手順を示します。
使用するフレームワーク:Laravel
1. プロジェクトのセットアップ
Laravelプロジェクトを新規作成します。
composer create-project --prefer-dist laravel/laravel myProject
cd myProject
2. データベース設定
.env
ファイルを編集して、データベース接続情報を設定します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myDatabase
DB_USERNAME=myUser
DB_PASSWORD=myPassword
3. マイグレーションの作成
次に、データベースのマイグレーションファイルを作成し、articles
テーブルを定義します。
php artisan make:migration create_articles_table
database/migrations/xxxx_xx_xx_xxxxxx_create_articles_table.php
ファイルを編集します。
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
マイグレーションを実行します。
php artisan migrate
4. モデルとコントローラの作成
Article
モデルとコントローラを作成します。
php artisan make:model Article -m
php artisan make:controller ArticleController
5. バリデーションとCSRF対策の実装
コントローラを編集して、バリデーションとCSRF対策を追加します。
app/Http/Controllers/ArticleController.php
を以下のように編集します。
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Article;
class ArticleController extends Controller
{
public function create()
{
return view('articles.create');
}
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
$article = new Article($validatedData);
$article->save();
return redirect('articles');
}
public function index()
{
$articles = Article::all();
return view('articles.index', compact('articles'));
}
}
6. ルートの設定
routes/web.php
にルートを追加します。
use App\Http\Controllers\ArticleController;
Route::get('articles', [ArticleController::class, 'index'])->name('articles.index');
Route::get('articles/create', [ArticleController::class, 'create'])->name('articles.create');
Route::post('articles', [ArticleController::class, 'store'])->name('articles.store');
7. ビューの作成
ビューを作成します。
resources/views/articles/create.blade.php
:
<!DOCTYPE html>
<html>
<head>
<title>Create Article</title>
</head>
<body>
<h1>Create Article</h1>
<form method="POST" action="{{ route('articles.store') }}">
@csrf
<label for="title">Title:</label>
<input type="text" name="title" id="title" required>
<br>
<label for="body">Body:</label>
<textarea name="body" id="body" required></textarea>
<br>
<button type="submit">Submit</button>
</form>
</body>
</html>
resources/views/articles/index.blade.php
:
<!DOCTYPE html>
<html>
<head>
<title>Articles</title>
</head>
<body>
<h1>Articles</h1>
<ul>
@foreach($articles as $article)
<li>{{ $article->title }}</li>
@endforeach
</ul>
<a href="{{ route('articles.create') }}">Create New Article</a>
</body>
</html>
8. アプリケーションの実行とテスト
ローカルサーバーを起動し、アプリケーションをテストします。
php artisan serve
ブラウザでhttp://localhost:8000/articles
にアクセスし、記事の作成フォームに移動してテストします。
これで、バリデーションとCSRF対策が実装され、正しく機能しているか確認できます。