0
2

Laravelを1日でマスターしたい人向けチュートリアル

Last updated at Posted at 2024-08-12

Chapter 1: Laravelの紹介

Laravelは、PHPで書かれたオープンソースのWebアプリケーションフレームワークです。MVC(Model-View-Controller)アーキテクチャに基づいており、開発者が効率的にWebアプリケーションを構築できるように設計されています。豊富な機能と優れたドキュメントが特徴です。

Chapter 2: 開発環境のセットアップ

Laravelを使用するには、PHP、Composer、およびLaravel自体をインストールする必要があります。以下のコマンドで新しいLaravelプロジェクトを作成できます:

composer create-project --prefer-dist laravel/laravel myApp

Chapter 3: Laravelのディレクトリ構造

Laravelのディレクトリ構造は、アプリケーションの異なる部分を整理するために設計されています。主なディレクトリには、appconfigdatabaseresourcesroutesなどがあります。

Chapter 4: ルーティングの基本

Laravelのルーティングは、routes/web.phpで定義されます。シンプルなルートは次のように記述します:

Route::get('/', function () {
    return view('welcome');
});

Chapter 5: コントローラとビュー

コントローラは、アプリケーションのロジックを管理します。以下のコマンドでコントローラを作成できます:

php artisan make:controller MyController

ビューはresources/viewsに保存され、Bladeテンプレートエンジンを使用します。

Chapter 6: Bladeテンプレートエンジン

Bladeは、Laravelのテンプレートエンジンで、HTMLとPHPを組み合わせて動的なビューを作成します。@extends@sectionを使用してテンプレートを構築します。

Chapter 7: データベース設定とマイグレーション

config/database.phpでデータベース接続を設定します。マイグレーションは、データベーススキーマを管理するために使用されます。以下のコマンドでマイグレーションを作成します:

php artisan make:migration create_users_table

Chapter 8: Eloquent ORMの基本

Eloquentは、LaravelのORM(オブジェクトリレーショナルマッピング)で、データベースとのやり取りを簡単にします。モデルはapp/Modelsに保存され、以下のコマンドで作成します:

php artisan make:model User

Chapter 9: CRUD操作の実装

Eloquentを使用して、基本的なCRUD(Create, Read, Update, Delete)操作を実装します。例えば、新しいレコードを作成するには:

$user = new User;
$user->name = 'Taro';
$user->save();

Chapter 10: フォーム処理とバリデーション

フォームからのデータを受け取り、バリデーションを行います。$request->validate()を使用して、入力データを検証します。

フォームの作成

まず、ユーザー情報を入力するためのフォームを作成します。

ビューの作成

resources/views/user_form.blade.phpを作成します。

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>User Form</h1>
    @if ($errors->any())
        <div class="alert alert-danger">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif
    <form action="{{ route('user.store') }}" method="POST">
        @csrf
        <div class="form-group">
            <label for="name">Name</label>
            <input type="text" class="form-control" id="name" name="name" value="{{ old('name') }}">
            @error('name')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <div class="form-group">
            <label for="email">Email</label>
            <input type="email" class="form-control" id="email" name="email" value="{{ old('email') }}">
            @error('email')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
</div>
@endsection

ルートの設定

routes/web.phpにルートを追加します。

use App\Http\Controllers\UserController;

Route::get('/user/create', [UserController::class, 'create'])->name('user.create');
Route::post('/user', [UserController::class, 'store'])->name('user.store');

コントローラの作成

以下のコマンドでコントローラを作成します。

php artisan make:controller UserController

UserControllerにフォームの表示とデータの保存ロジックを追加します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function create()
    {
        return view('user_form');
    }

    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users,email',
        ]);

        // Assuming you have a User model
        \App\Models\User::create($validatedData);

        return redirect()->route('user.create')->with('success', 'User created successfully.');
    }
}

バリデーションの説明

  • $request->validate(): このメソッドは、リクエストデータを検証し、失敗した場合は自動的にリダイレクトしてエラーメッセージを表示します。
  • required: フィールドが必須であることを示します。
  • max:255: フィールドの最大文字数を255文字に制限します。
  • email: フィールドが有効なメールアドレス形式であることを確認します。
  • unique:users,email: usersテーブルのemailカラムに一意であることを確認します。

フォームの送信とエラーメッセージ

フォームを送信すると、バリデーションが実行され、エラーがあればビューに表示されます。成功した場合は、ユーザーが作成され、成功メッセージが表示されます。


これで、Laravelを使用したフォーム処理とバリデーションの基本的な実装が完了しました。これらのコードを使用して、フォームデータを安全に処理し、ユーザーにフィードバックを提供することができます。

Chapter 11: 認証の基本

Laravelは、認証機能を簡単に実装するための仕組みを提供しています。以下のコマンドで認証を設定します:

composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev

Chapter 12: 認可とポリシー

ポリシーを使用して、ユーザーのアクションを制御します。以下のコマンドでポリシーを作成します:

php artisan make:policy PostPolicy

Chapter 13: ミドルウェアの理解

ミドルウェアは、リクエストを処理する前にフィルタリングするために使用されます。以下のコマンドでミドルウェアを作成します:

php artisan make:middleware CheckAge

Chapter 14: ファイルアップロードとストレージ

ファイルアップロード機能を実装し、Storageファサードを使用してファイルを保存します。

ファイルアップロードの設定

ルート設定

routes/web.phpにルートを追加します。

Route::get('/upload', [FileController::class, 'create']);
Route::post('/upload', [FileController::class, 'store']);

コントローラの作成

以下のコマンドでコントローラを作成します。

php artisan make:controller FileController

FileControllerに以下のコードを追加します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class FileController extends Controller
{
    public function create()
    {
        return view('upload');
    }

    public function store(Request $request)
    {
        $request->validate([
            'file' => 'required|file|mimes:jpg,png,pdf|max:2048',
        ]);

        $path = $request->file('file')->store('uploads');

        return back()->with('success', 'File uploaded successfully.')->with('path', $path);
    }
}

ビューの作成

resources/views/upload.blade.phpを作成します。

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>File Upload</h1>
    @if (session('success'))
        <div class="alert alert-success">
            {{ session('success') }}
            <p>Path: {{ session('path') }}</p>
        </div>
    @endif
    <form action="/upload" method="POST" enctype="multipart/form-data">
        @csrf
        <div class="form-group">
            <input type="file" name="file" class="form-control">
            @error('file')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <button type="submit" class="btn btn-primary">Upload</button>
    </form>
</div>
@endsection

Chapter 15: LaravelでのAJAXリクエスト

AJAXを使用して非同期リクエストを送信し、データを取得します。ここでは、axiosを使用します。

AJAXリクエストの設定

ルート設定

routes/web.phpにルートを追加します。

Route::get('/ajax', [AjaxController::class, 'index']);
Route::get('/ajax/data', [AjaxController::class, 'getData']);

コントローラの作成

以下のコマンドでコントローラを作成します。

php artisan make:controller AjaxController

AjaxControllerに以下のコードを追加します。

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class AjaxController extends Controller
{
    public function index()
    {
        return view('ajax');
    }

    public function getData()
    {
        $data = ['message' => 'Hello, this is a message from the server!'];
        return response()->json($data);
    }
}

ビューの作成

resources/views/ajax.blade.phpを作成します。

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>AJAX Example</h1>
    <button id="fetchData" class="btn btn-primary">Fetch Data</button>
    <div id="data" class="mt-3"></div>
</div>

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>
document.getElementById('fetchData').addEventListener('click', function () {
    axios.get('/ajax/data')
        .then(function (response) {
            document.getElementById('data').innerHTML = response.data.message;
        })
        .catch(function (error) {
            console.error('Error fetching data:', error);
        });
});
</script>
@endsection

Chapter 16: LaravelでのAPI開発

Laravelを使用してRESTful APIを構築します。

API開発の設定

APIルート設定

routes/api.phpにルートを追加します。

use App\Http\Controllers\Api\PostController;

Route::apiResource('posts', PostController::class);

APIコントローラの作成

以下のコマンドでAPIコントローラを作成します。

php artisan make:controller Api/PostController --api

PostControllerに以下のコードを追加します。

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        return Post::all();
    }

    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);

        $post = Post::create($request->all());
        return response()->json($post, 201);
    }

    public function show(Post $post)
    {
        return $post;
    }

    public function update(Request $request, Post $post)
    {
        $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);

        $post->update($request->all());
        return response()->json($post, 200);
    }

    public function destroy(Post $post)
    {
        $post->delete();
        return response()->json(null, 204);
    }
}

Chapter 17: Laravelでのテスト

ユニットテストと機能テストを作成して、アプリケーションの信頼性を確保します。以下のコマンドでテストを作成します:

php artisan make:test UserTest

Chapter 18: Laravelアプリケーションのデプロイ

本番環境へのデプロイ方法を学びます。EnvoyerForgeなどのツールを使用して、デプロイプロセスを自動化します。

Chapter 19: LaravelとVue.jsの統合

Vue.jsを使用して、モダンなフロントエンドを構築します。laravel/uiパッケージを使用して、Vue.jsをプロジェクトに統合します。

ステップ1: Laravel/uiパッケージのインストール

まず、laravel/uiパッケージをインストールして、Vue.jsをプロジェクトに統合します。

composer require laravel/ui

次に、Vue.jsのセットアップを行います。

php artisan ui vue

これにより、Vue.jsがセットアップされ、必要なフロントエンドのファイルが生成されます。

ステップ2: フロントエンドのビルド

Node.jsとnpmがインストールされていることを確認し、以下のコマンドを実行してフロントエンドの依存関係をインストールします。

npm install
npm run dev

これにより、resources/jsディレクトリにあるVueコンポーネントがコンパイルされ、public/jsディレクトリに出力されます。

ステップ3: Vueコンポーネントの作成

デフォルトでresources/js/components/ExampleComponent.vueが作成されています。このコンポーネントをカスタマイズするか、新しいコンポーネントを作成できます。

新しいコンポーネントの作成

例えば、resources/js/components/HelloWorld.vueという名前の新しいコンポーネントを作成します。

<template>
  <div>
    <h1>Hello, World!</h1>
    <p>This is a Vue component integrated with Laravel.</p>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld'
}
</script>

<style scoped>
h1 {
  color: #42b983;
}
</style>

ステップ4: Vueコンポーネントの登録

resources/js/app.jsで新しいコンポーネントを登録します。

require('./bootstrap');

import { createApp } from 'vue';
import HelloWorld from './components/HelloWorld.vue';

const app = createApp({});

app.component('hello-world', HelloWorld);

app.mount('#app');

ステップ5: LaravelビューでVueコンポーネントを使用

LaravelのビューでVueコンポーネントを使用するには、resources/views/welcome.blade.phpなどのBladeテンプレートに以下のように記述します。

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel Vue Integration</title>
    <link href="{{ mix('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <hello-world></hello-world>
    </div>
    <script src="{{ mix('js/app.js') }}"></script>
</body>
</html>

ステップ6: サーバーの起動

Laravelサーバーを起動して、Vueコンポーネントが正しく表示されることを確認します。

php artisan serve

ブラウザでhttp://localhost:8000にアクセスし、Hello, World!メッセージが表示されることを確認してください。


これで、LaravelとVue.jsの基本的な統合が完了しました。このセットアップにより、Vue.jsを使用してモダンでインタラクティブなフロントエンドを構築できるようになります。Vueコンポーネントをさらにカスタマイズし、アプリケーションのニーズに合わせて拡張することができます。


Chapter 20: 高度な機能とヒント

キューの使用

Laravelのキューを使用して、時間のかかるタスクをバックグラウンドで処理します。以下は、メール送信をキューに入れる例です。

ジョブの作成

まず、ジョブを作成します。

php artisan make:job SendEmailJob

SendEmailJobクラスを編集して、メール送信ロジックを追加します。

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use App\Mail\SampleMail;
use Mail;

class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $email;

    public function __construct($email)
    {
        $this->email = $email;
    }

    public function handle()
    {
        Mail::to($this->email)->send(new SampleMail());
    }
}

メールの作成

メールクラスを作成します。

php artisan make:mail SampleMail

SampleMailクラスを編集して、メールの内容を設定します。

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class SampleMail extends Mailable
{
    use Queueable, SerializesModels;

    public function build()
    {
        return $this->view('emails.sample')
                    ->subject('Sample Email');
    }
}

キューのディスパッチ

コントローラや他の場所でジョブをディスパッチします。

use App\Jobs\SendEmailJob;

public function sendEmail()
{
    $email = 'example@example.com';
    SendEmailJob::dispatch($email);
}

キューの設定

.envファイルでキューの設定を行います。例えば、databaseを使用する場合は以下のように設定します。

QUEUE_CONNECTION=database

キューテーブルを作成します。

php artisan queue:table
php artisan migrate

キューワーカーを起動します。

php artisan queue:work

イベントとリスナーの使用

Laravelのイベントとリスナーを使用して、アプリケーション内のさまざまなアクションに対応します。

イベントとリスナーの作成

イベントを作成します。

php artisan make:event UserRegistered

リスナーを作成します。

php artisan make:listener SendWelcomeEmail

UserRegisteredイベントを編集します。

namespace App\Events;

use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public $user;

    public function __construct($user)
    {
        $this->user = $user;
    }
}

SendWelcomeEmailリスナーを編集します。

namespace App\Listeners;

use App\Events\UserRegistered;
use App\Mail\WelcomeMail;
use Mail;

class SendWelcomeEmail
{
    public function handle(UserRegistered $event)
    {
        Mail::to($event->user->email)->send(new WelcomeMail());
    }
}

イベントのディスパッチ

ユーザー登録時にイベントをディスパッチします。

use App\Events\UserRegistered;

public function register(Request $request)
{
    $user = User::create($request->all());
    event(new UserRegistered($user));
}

イベントとリスナーの登録

EventServiceProviderでイベントとリスナーを登録します。

protected $listen = [
    UserRegistered::class => [
        SendWelcomeEmail::class,
    ],
];

ブロードキャストの使用

Laravelのブロードキャストを使用して、リアルタイムでクライアントにイベントを送信します。

ブロードキャストイベントの作成

ブロードキャストイベントを作成します。

php artisan make:event MessageSent

MessageSentイベントを編集して、ブロードキャスト設定を行います。

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class MessageSent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $message;

    public function __construct($message)
    {
        $this->message = $message;
    }

    public function broadcastOn()
    {
        return new PrivateChannel('chat');
    }
}

ブロードキャストの設定

.envファイルでブロードキャストの設定を行います。

BROADCAST_DRIVER=pusher

config/broadcasting.phpでPusherの設定を行います。

クライアントでのリスニング

JavaScriptでイベントをリッスンします。resources/js/app.jsに以下を追加します。

import Echo from "laravel-echo";
window.Pusher = require('pusher-js');

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: process.env.MIX_PUSHER_APP_KEY,
    cluster: process.env.MIX_PUSHER_APP_CLUSTER,
    encrypted: true
});

window.Echo.private('chat')
    .listen('MessageSent', (e) => {
        console.log('Message received:', e.message);
    });

Chapter 21: CRUDアプリケーションと認証の作成

この章では、LaravelでCRUDアプリケーションを作成し、認証を実装します。

ステップ1: 認証の設定

まず、認証を設定します。以下のコマンドを実行して、認証用のビューとコントローラを生成します。

composer require laravel/ui
php artisan ui vue --auth
npm install && npm run dev

ステップ2: モデルとマイグレーションの作成

CRUD対象のモデルとマイグレーションを作成します。例えば、Postモデルを作成します。

php artisan make:model Post -m

database/migrationsディレクトリにあるマイグレーションファイルを編集して、必要なカラムを追加します。

Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('content');
    $table->timestamps();
});

マイグレーションを実行します。

php artisan migrate

ステップ3: コントローラの作成

CRUD機能を管理するコントローラを作成します。

php artisan make:controller PostController --resource

PostControllerにCRUD操作を実装します。

public function index() {
    $posts = Post::all();
    return view('posts.index', compact('posts'));
}

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

public function store(Request $request) {
    $request->validate([
        'title' => 'required|max:255',
        'content' => 'required',
    ]);
    Post::create($request->all());
    return redirect()->route('posts.index');
}

public function show(Post $post) {
    return view('posts.show', compact('post'));
}

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

public function update(Request $request, Post $post) {
    $request->validate([
        'title' => 'required|max:255',
        'content' => 'required',
    ]);
    $post->update($request->all());
    return redirect()->route('posts.index');
}

public function destroy(Post $post) {
    $post->delete();
    return redirect()->route('posts.index');
}

ステップ4: ルートの設定

routes/web.phpにリソースルートを追加します。

Route::resource('posts', PostController::class)->middleware('auth');

ステップ5: ビューの作成

resources/views/postsディレクトリにビューを作成します。

index.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Posts</h1>
    <a href="{{ route('posts.create') }}" class="btn btn-primary">Create New Post</a>
    <table class="table mt-3">
        <thead>
            <tr>
                <th>Title</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($posts as $post)
            <tr>
                <td>{{ $post->title }}</td>
                <td>
                    <a href="{{ route('posts.show', $post->id) }}" class="btn btn-info">View</a>
                    <a href="{{ route('posts.edit', $post->id) }}" class="btn btn-warning">Edit</a>
                    <form action="{{ route('posts.destroy', $post->id) }}" method="POST" style="display:inline;">
                        @csrf
                        @method('DELETE')
                        <button type="submit" class="btn btn-danger">Delete</button>
                    </form>
                </td>
            </tr>
            @endforeach
        </tbody>
    </table>
</div>
@endsection

create.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Create Post</h1>
    <form action="{{ route('posts.store') }}" method="POST">
        @csrf
        <div class="form-group">
            <label for="title">Title</label>
            <input type="text" class="form-control" id="title" name="title" value="{{ old('title') }}">
            @error('title')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <div class="form-group">
            <label for="content">Content</label>
            <textarea class="form-control" id="content" name="content">{{ old('content') }}</textarea>
            @error('content')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>
</div>
@endsection

edit.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Edit Post</h1>
    <form action="{{ route('posts.update', $post->id) }}" method="POST">
        @csrf
        @method('PUT')
        <div class="form-group">
            <label for="title">Title</label>
            <input type="text" class="form-control" id="title" name="title" value="{{ old('title', $post->title) }}">
            @error('title')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <div class="form-group">
            <label for="content">Content</label>
            <textarea class="form-control" id="content" name="content">{{ old('content', $post->content) }}</textarea>
            @error('content')
                <small class="text-danger">{{ $message }}</small>
            @enderror
        </div>
        <button type="submit" class="btn btn-primary">Update</button>
    </form>
</div>
@endsection

show.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>{{ $post->title }}</h1>
    <p>{{ $post->content }}</p>
    <a href="{{ route('posts.index') }}" class="btn btn-secondary">Back</a>
</div>
@endsection

ステップ6: 認証の確認

アプリケーションを実行し、ユーザーがログインしている場合にのみCRUD操作が可能であることを確認します。

これで、Laravelを使用した基本的なCRUDアプリケーションと認証の実装が完了です。各ステップを詳細に説明し、コード例を提供することで、初心者でも簡単に理解できるようにしています。


このチュートリアルをもとに、各章をさらに詳細に説明し、実際のコード例や実践的なヒントを追加することで、初心者向けの包括的なLaravelチュートリアルを作成することができます。

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