LoginSignup
0
0

ルーティングとは?

Posted at

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対策が実装され、正しく機能しているか確認できます。

0
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
0
0