【徹底解説】Laravel + Vue.js 連携の始め方

はい、承知いたしました。LaravelとVue.jsを連携させるための詳細な解説記事を約5000語で記述します。


【徹底解説】Laravel + Vue.js 連携の始め方

はじめに

現代のWebアプリケーション開発において、サーバーサイドフレームワークであるLaravelと、クライアントサイドのJavaScriptフレームワークであるVue.jsの組み合わせは非常に人気があります。Laravelの堅牢なバックエンド機能と、Vue.jsのインタラクティブでリッチなユーザーインターフェース構築能力を組み合わせることで、効率的かつ高品質なWebアプリケーション開発が可能になります。

この記事では、LaravelとVue.jsをゼロから連携させて開発を始めるための手順を、約5000語の詳細な解説とともにご紹介します。開発環境の準備から、プロジェクトのセットアップ、実際の連携方法、API通信、ルーティング、状態管理、そして開発・デプロイメントに至るまで、網羅的に解説していきます。

なぜLaravelとVue.jsを組み合わせるのか?

Laravelは、PHPのフレームワークとして、MVCアーキテクチャに基づいた構造化された開発、Eloquent ORMによるデータベース操作、強力なルーティング、テンプレートエンジン(Blade)、セキュリティ機能(CSRF保護、認証・認可)、タスクキュー、イベントシステムなど、Webアプリケーション開発に必要な多くの機能を提供します。特に、RESTful APIの開発が容易であり、バックエンドとしての役割を担うのに優れています。

一方、Vue.jsは、コンポーネントベースのアーキテクチャを採用したプログレッシブなJavaScriptフレームワークです。学習コストが比較的低く、柔軟性が高いため、小規模な機能追加から大規模なシングルページアプリケーション(SPA)まで、幅広い用途に対応できます。インタラクティブなUIの構築、状態管理、クライアントサイドルーティングなどを得意とします。

この二つを組み合わせることで、以下のようなメリットが得られます。

  1. 役割の明確化: Laravelがバックエンド(データ処理、認証、API提供など)を、Vue.jsがフロントエンド(UI構築、ユーザー操作への応答、データの表示など)を担当するため、コードベースが分離され、保守性が向上します。
  2. リッチなユーザー体験: Vue.jsによるインタラクティブなUIと、非同期通信(API経由)によるデータ更新により、ページ遷移なしでスムーズな操作感を持つアプリケーションを構築できます。
  3. 開発生産性の向上: それぞれのフレームワークが得意とする分野に集中できるため、開発効率が高まります。Laravelのエコシステム(Composerパッケージ)とVue.jsのエコシステム(npmパッケージ)を利用できる点も大きな強みです。
  4. パフォーマンス: クライアント側でUIの大部分を描画するため、サーバーの負荷を軽減できます。API通信も非同期で行われるため、必要なデータだけを効率的に取得できます。

この記事の対象読者

  • Laravelを使った開発経験がある、または学習中のエンジニア。
  • Vue.jsを使った開発経験がある、または学習中のエンジニア。
  • LaravelとVue.jsを組み合わせてWebアプリケーションを開発したいと考えているエンジニア。
  • 基本的なPHP、JavaScriptの知識がある方。

第1章: 開発環境を整える

LaravelとVue.jsを連携させるには、それぞれの開発に必要なツールを準備する必要があります。

必要なものリスト

  1. PHP: LaravelはPHPで動作するため、PHPが必要です。Laravelのバージョンによって必要なPHPのバージョンが異なりますが、最新のLaravelではPHP 8.2以上が推奨されます。
  2. Composer: PHPの依存関係を管理するためのツールです。Laravelやその他のPHPライブラリのインストールに使います。
  3. Node.js & npm/yarn: Vue.jsおよび関連するフロントエンドツール(ビルドツール、パッケージマネージャーなど)を実行するために必要です。Node.jsにはパッケージマネージャーであるnpmが標準で付属していますが、より高速なyarnを使う開発者も多いです。
  4. Laravel: PHPフレームワーク本体です。
  5. データベース: アプリケーションでデータを扱う場合、データベースが必要です。MySQL, PostgreSQL, SQLite, SQL Serverなど、Laravelがサポートする様々なデータベースを利用できます。開発中はSQLiteやDocker上のMySQLなどを使うのが手軽です。
  6. Webサーバー: 開発中はLaravelが提供する開発用サーバー(php artisan serve)を利用できますが、本番環境ではNginxやApacheなどが必要です。
  7. エディタ/IDE: コードを書くためのツールです。VS Code, PhpStormなどが人気です。

各ツールのインストール方法

各ツールの具体的なインストール手順は、OSやバージョンによって異なりますが、ここでは一般的な方法と公式ドキュメントへのリンクを示します。

PHP:

  • macOS (Homebrew): brew install php
  • Windows: XAMPP, WampServer, Laragonなどの統合環境を利用するか、公式ダウンロードページからインストーラーをダウンロードします。
  • Linux: ディストリビューションのパッケージマネージャーを使用します(例: sudo apt update && sudo apt install php php-cli php-common php-mysql ...)。

公式ドキュメント: https://www.php.net/manual/en/install.php

インストール後、ターミナルで php -v を実行し、バージョン情報が表示されるか確認してください。

Composer:

Composerの公式ウェブサイトにアクセスし、OSごとのインストール手順に従ってください。

公式ドキュメント: https://getcomposer.org/download/

インストール後、ターミナルで composer --version を実行し、バージョン情報が表示されるか確認してください。

Node.js & npm/yarn:

Node.jsの公式ウェブサイトからインストーラーをダウンロードして実行するのが最も簡単です。通常、Node.jsと一緒にnpmもインストールされます。

公式ドキュメント: https://nodejs.org/ja/download/

インストール後、ターミナルで node -vnpm -v を実行し、バージョン情報が表示されるか確認してください。

yarnを使用したい場合は、npmを使ってyarnをインストールします。

npm install -g yarn

インストール後、 yarn --version を実行して確認してください。

Laravel:

LaravelはComposerを使ってプロジェクトごとにインストールするのが一般的です。グローバルにLaravelインストーラーをインストールする方法もありますが、 Composerを使った方法を推奨します。

環境構築が面倒な場合は、Dockerを使ったLaravel開発環境であるLaravel Sailを利用するのも非常に強力な選択肢です。Sailを使えば、PHP, Composer, Node.js, データベースなどをDockerコンテナとしてまとめて管理できます。

Sailに関する公式ドキュメント: https://laravel.com/docs/sail

この記事では、Sailを使わない前提で進めますが、Sailユーザーも基本的な概念は同じです。

第2章: Laravelプロジェクトの準備

Laravelプロジェクトを新規作成し、データベース設定を行います。

Laravelプロジェクトの新規作成

プロジェクトを作成したいディレクトリに移動し、Composerを使って以下のコマンドを実行します。

bash
composer create-project laravel/laravel laravel-vue-app

このコマンドは、laravel-vue-app という名前の新しいディレクトリを作成し、その中に最新版のLaravelプロジェクトをセットアップします。

プロジェクトディレクトリに移動します。

bash
cd laravel-vue-app

プロジェクト構造の概要

Laravelプロジェクトの主要なディレクトリ構造を簡単に説明します。

  • app/: アプリケーションの核となるコード(コントローラー、モデル、サービスプロバイダーなど)を配置します。
  • bootstrap/: フレームワークの起動に関するファイルが含まれます。
  • config/: アプリケーションの各種設定ファイル(データベース、メールなど)が置かれます。
  • database/: データベースマイグレーション、シーダー、ファクトリーなどが含まれます。
  • public/: アプリケーションの公開ディレクトリです。画像、CSS、コンパイルされたJavaScriptファイルなどを配置し、Webサーバーはこのディレクトリをドキュメントルートとして設定します。
  • resources/: ビューファイル(Bladeテンプレート)、言語ファイル、そしてフロントエンドのアセット(JavaScript, CSS, Vueコンポーネントなど)を配置します。Vue.jsのコードは主に resources/js/ に配置します。
  • routes/: アプリケーションのルーティング定義ファイル(web.php, api.phpなど)が置かれます。
  • storage/: アプリケーションが生成するファイル(ログ、キャッシュ、アップロードファイルなど)を保存します。
  • tests/: 自動テストに関するファイルが置かれます。
  • vendor/: Composerによって管理されるPHPの依存ライブラリが置かれます。
  • .env: 環境変数ファイルです。データベース接続情報、APIキーなどの機密情報や環境ごとの設定を記述します。
  • package.json: Node.jsおよびnpm/yarnで管理されるフロントエンドの依存関係とスクリプトが定義されます。
  • webpack.mix.js または vite.config.js: フロントエンド資産(JavaScript, CSSなど)のコンパイル設定ファイルです。

.env ファイルによる環境設定

プロジェクトのルートディレクトリにある .env ファイルを開き、データベース接続情報を設定します。開発環境では、以下のように設定することが多いです。

dotenv
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_vue_app # 任意のデータベース名
DB_USERNAME=root # データベースのユーザー名
DB_PASSWORD= # データベースのパスワード

DB_DATABASE に指定した名前でデータベースを事前に作成しておく必要があります。

また、アプリケーションのURLなども設定します。

dotenv
APP_NAME="Laravel Vue App"
APP_ENV=local
APP_KEY= # プロジェクト作成時に自動生成される
APP_DEBUG=true
APP_URL=http://localhost:8000 # または開発用サーバーのアドレス

データベースマイグレーションの実行

Laravelにはデータベースのスキーマ管理機能であるマイグレーションがあります。ユーザー認証などに必要な基本的なテーブルは最初からマイグレーションファイルとして用意されています。

以下のコマンドでこれらのテーブルを作成できます。

bash
php artisan migrate

このコマンドを実行する前に、.env で設定したデータベースが存在し、指定したユーザーで接続できることを確認してください。

これで、Laravelプロジェクトのバックエンドの基本的な準備が整いました。次に、Vue.jsをプロジェクトに導入し、フロントエンドの準備を進めます。

第3章: Vue.jsを導入する – Laravel Mix / Vite の活用

LaravelプロジェクトでVue.jsを使うためには、Node.jsとnpm/yarnを使ってVue.jsおよび関連ライブラリをインストールし、フロントエンド資産をコンパイルする仕組みを導入する必要があります。Laravelは標準でLaravel Mix(webpackのラッパー)またはVite(モダンなフロントエンドビルドツール)との連携機能を提供しています。Laravel 9以降はViteがデフォルトになっていますが、ここでは両方について触れつつ、主にViteを使った方法で進めます。

Laravel Mix / Vite とは

  • Laravel Mix: Webpackというフロントエンド向けのモジュールバンドラーを、よりシンプルに扱うためのLaravel公式ツールです。JavaScriptファイルのバンドル、SCSS/Sass/Lessのコンパイル、ファイルのコピー、バージョニング(キャッシュ busting)などを行います。webpack.mix.js という設定ファイルに処理を記述します。
  • Vite: Vue.jsの作者であるEvan You氏によって開発された、モダンなフロントエンドビルドツールです。開発時にはES Modulesネイティブの機能を活用し、高速なホットモジュールリプレイスメント(HMR)を提供します。ビルド時にはRollupをベースに最適な形でバンドルを行います。Laravel 9以降、laravel/ui パッケージなしでもVue.jsを導入する際にViteが推奨されるようになりました。設定ファイルは vite.config.js です。

どちらを使うかはプロジェクトの要件やLaravelのバージョン、開発者の慣れによりますが、新規プロジェクトであればViteを使うのが現代的でおすすめです。

Vue.jsのインストール

プロジェクトのルートディレクトリにいることを確認し、Node.jsの依存関係をインストールします。Laravelプロジェクトを新規作成した時点では、package.json にLaravelのフロントエンド開発に必要な依存関係(Vue.js, Vite, PostCSS, Autoprefixerなど)が既に含まれていることが多いです。

以下のコマンドを実行して、これらの依存関係をインストールします。

bash
npm install # または yarn install

このコマンドは package.json に記述されている全てのパッケージを node_modules ディレクトリにインストールします。この中にVue.js本体やVueをLaravelと連携させるための @vitejs/plugin-vue などが含まれます。

package.json の解説

package.json ファイルには、プロジェクトのメタ情報、依存関係、そして様々な開発タスクを実行するためのスクリプトが定義されています。Vue.jsと関連パッケージをインストールすると、dependenciesdevDependencies セクションにそれらが追記されます。

特に重要なのは scripts セクションです。ここでは、フロントエンドのビルドや開発サーバーの起動に関するコマンドが定義されています。

json
"scripts": {
"dev": "vite", // 開発用サーバー起動(Viteの場合)
"build": "vite build", // 本番用ビルド(Viteの場合)
// または Mix の場合:
// "dev": "npm run development",
// "development": "mix",
// "watch": "mix watch",
// "prod": "npm run production",
// "production": "mix --production"
},

これらのスクリプトは、npm run [スクリプト名] または yarn [スクリプト名] という形式で実行できます。

resources/js/app.js の役割と初期設定

resources/js/app.js は、LaravelプロジェクトにおけるフロントエンドJavaScriptの主要なエントリーポイントとなるファイルです。ここで、Vue.jsアプリケーションのインスタンスを作成し、必要なコンポーネントを登録したり、ルーティングや状態管理の設定を行ったりします。

プロジェクト作成直後の resources/js/app.js は、以下のような内容になっていることが多いです(Viteの場合)。

“`javascript
import ‘./bootstrap’;

import { createApp } from ‘vue’;

const app = createApp({});

// app.component(‘example-component’, require(‘./components/ExampleComponent.vue’).default); // Mix スタイル
import ExampleComponent from ‘./components/ExampleComponent.vue’; // Vite スタイル
app.component(‘example-component’, ExampleComponent);

app.mount(‘#app’);
“`

解説:

  • import './bootstrap';: プロジェクト共通の初期設定(Axiosの設定など)を行う resources/js/bootstrap.js を読み込んでいます。
  • import { createApp } from 'vue';: Vue 3の新しいAPIである createApp をインポートしています。
  • const app = createApp({});: Vueアプリケーションのインスタンスを作成します。ここに各種プラグインや設定を追加していきます。
  • app.component(...): Vueコンポーネントをグローバルに登録します。ここでは例として ExampleComponent.vue'example-component' という名前で登録しています。これにより、Bladeテンプレート内で <example-component></example-component> のように使用できるようになります。
  • app.mount('#app');: Vueアプリケーションを指定されたDOM要素(ここではIDが app の要素)にマウントします。

resources/js/components/ ディレクトリ

resources/js/components/ ディレクトリは、Vue.jsの単一ファイルコンポーネント(.vue ファイル)を配置するための慣習的な場所です。プロジェクト作成時には ExampleComponent.vue というサンプルコンポーネントが配置されています。

単一ファイルコンポーネントは、<template>, <script>, <style> ブロックを一つのファイルに記述する形式で、Vue.js開発において非常に一般的です。

Laravel Mix (webpack.mix.js) / Vite (vite.config.js) の設定

Vite (vite.config.js)

Laravel 9以降でViteがデフォルトの場合、vite.config.js ファイルが存在します。Vue.jsを使うための設定は通常、最初から含まれています。

“`javascript
import { defineConfig } from ‘vite’;
import laravel from ‘laravel-vite-plugin’;
import vue from ‘@vitejs/plugin-vue’; // Vueプラグインをインポート

export default defineConfig({
plugins: [
laravel({
input: [ // エントリーポイントを指定
‘resources/css/app.css’,
‘resources/js/app.js’,
],
refresh: true,
}),
vue(), // Vueプラグインを追加
],
});
“`

この設定では、resources/css/app.cssresources/js/app.js をエントリーポイントとして指定し、@vitejs/plugin-vue を使用して .vue ファイルを扱えるようにしています。

Laravel Mix (webpack.mix.js)

Laravel Mixを使用する場合、webpack.mix.js ファイルが存在します。Vue.jsを有効にするには、設定に .vue() を追加します。

“`javascript
const mix = require(‘laravel-mix’);

mix.js(‘resources/js/app.js’, ‘public/js’) // app.js を public/js にコンパイル
.vue() // Vue.js を使用することを宣言
.css(‘resources/css/app.css’, ‘public/css’) // CSS を public/css にコンパイル
.version(); // キャッシュ対策としてファイル名にハッシュを付加
“`

この設定は、resources/js/app.jspublic/js/app.js に、resources/css/app.csspublic/css/app.css にコンパイルすることを意味します。.vue() を呼び出すことで、.vue ファイルをJavaScriptとしてコンパイルできるようになります。

フロントエンド資産のコンパイル

Node.jsの依存関係をインストールし、app.js および設定ファイルを準備したら、フロントエンドのJavaScriptやCSSファイルをコンパイルします。

開発中 (Vite):

bash
npm run dev # または yarn dev

このコマンドはViteの開発サーバーを起動し、ファイルの変更を監視して自動的にブラウザに反映(HMR)します。Viteは開発中にはバンドルを行わず、ネイティブES Modulesを利用するため、非常に高速です。

php artisan serve でLaravelの開発サーバーも起動し、同時に実行する必要があります。

本番用ビルド (Vite):

bash
npm run build # または yarn build

このコマンドは本番環境向けにコードを最適化してビルドします。結果は通常 public/build ディレクトリに出力されます。

開発中 (Laravel Mix):

bash
npm run development # または yarn development

または、ファイルの変更を監視して自動的に再コンパイルする場合は、

bash
npm run watch # または yarn watch

を使用します。

本番用ビルド (Laravel Mix):

bash
npm run production # または yarn production

このコマンドはコードを圧縮・最適化して本番環境向けにビルドします。

コンパイルが成功すると、public ディレクトリ内にコンパイルされたJavaScriptやCSSファイルが生成されます。

第4章: Laravel BladeとVueコンポーネントの連携

LaravelとVue.jsを連携させる最も一般的な方法は、Bladeテンプレートの一部、または全体をVue.jsアプリケーションとして扱うことです。

基本的な連携方法: BladeテンプレートにVueをマウント

Vue.jsアプリケーションをマウントするためには、Bladeテンプレート内のどこかにVueが制御する範囲を示す要素が必要です。慣習的に、アプリケーション全体を制御する場合、<body> タグの直下などにIDが appdiv 要素を配置します。

resources/views/welcome.blade.php ファイルを編集してみましょう。Laravelの標準的なようこそページです。

“`html+jinja



Laravel & Vue


@vite([‘resources/css/app.css’]) {# Vite の場合 #}
{# @mix(‘css/app.css’) #} {# Mix の場合 #}



{# Vue.js アプリケーションをマウントする要素 #}

{# ここに Vue コンポーネントや静的なHTMLを記述 #}

{# コンパイルされた JavaScript ファイルを読み込む #}
@vite([‘resources/js/app.js’]) {# Vite の場合 #}
{# @mix(‘js/app.js’) #} {# Mix の場合 #}

“`

解説:

  • <div id="app">: この要素がVueアプリケーションのルート要素になります。resources/js/app.jsapp.mount('#app') と指定した要素と一致させてください。
  • <example-component></example-component>: resources/js/app.js でグローバルに登録したVueコンポーネントを、HTMLタグのように記述して配置しています。
  • @vite(['resources/css/app.css']) / @vite(['resources/js/app.js']): Viteを使用する場合、Bladeの @vite ディレクティブを使ってコンパイルされたCSS/JSファイルを読み込みます。これは、Vite開発サーバーの起動時には必要なアセットをViteから提供し、ビルド後には public/build ディレクトリ内の適切なパスにあるファイルを読み込むように自動的に切り替えてくれます。
  • @mix('css/app.css') / @mix('js/app.js'): Laravel Mixを使用する場合、@mix ディレクティブを使います。これも開発中と本番ビルド後で適切なファイルを読み込むように処理してくれます。

このBladeファイルをブラウザで表示するには、Laravelの開発サーバーを起動します。

bash
php artisan serve

そして、ViteまたはMixのコンパイルコマンド(開発中の場合 npm run dev または npm run watch)も実行していることを確認してください。両方が起動している状態で、http://localhost:8000 (または php artisan serve で表示されたURL) にアクセスすると、Vueコンポーネントが描画されたページが表示されるはずです。

app.js でのVueインスタンス生成とマウント

前述の通り、resources/js/app.jscreateApp でアプリケーションインスタンスを作成し、mount('#app') でBladeテンプレート内の指定要素にマウントしています。

Vue 3では、複数のVueアプリケーションインスタンスを同じページ内にマウントすることも可能です。これにより、ページ全体をSPAにするのではなく、ページの一部分だけをVue.jsでインタラクティブにする、といった柔軟な構成が可能です。

例: ページに複数のVueコンポーネントがあり、それぞれを独立したVueインスタンスで管理したい場合。

“`javascript
// resources/js/app.js

import { createApp } from ‘vue’;
import ExampleComponent from ‘./components/ExampleComponent.vue’;
import AnotherComponent from ‘./components/AnotherComponent.vue’;

// グローバル登録はせずに、特定の要素にマウント
const app1 = createApp({});
app1.component(‘example-component’, ExampleComponent);
app1.mount(‘#app-section-1’); // Blade テンプレート内の

にマウント

const app2 = createApp({});
app2.component(‘another-component’, AnotherComponent);
app2.mount(‘#app-section-2’); // Blade テンプレート内の

にマウント
“`

このようにすることで、ページ内の異なる部分を独立したVueアプリケーションとして管理できます。

Vueコンポーネントの登録とBladeからの利用

resources/js/app.js でコンポーネントを登録する方法はいくつかあります。

グローバル登録 (例: ExampleComponent)

javascript
import ExampleComponent from './components/ExampleComponent.vue';
const app = createApp({});
app.component('example-component', ExampleComponent); // アプリケーション全体で利用可能になる
app.mount('#app');

この方法で登録されたコンポーネントは、Vueアプリケーションがマウントされた要素 (#app 内) のどこでも <example-component></example-component> タグを使って利用できます。

ローカル登録 (親コンポーネント内)

コンポーネントを特定の親コンポーネント内でのみ使用したい場合は、その親コンポーネントの <script> ブロック内でローカル登録します。

“`vue

“`

この ParentComponent をグローバル登録するか、別の親でローカル登録して使います。

Laravelと連携する場合、Bladeテンプレートに配置するルートコンポーネントはグローバル登録するか、app.js 内で直接読み込んでマウント対象のVueインスタンスのコンポーネントオプションに指定することが多いです。しかし、上記の例のように、Bladeに <example-component> のようにカスタム要素を書く場合は、そのコンポーネントはVueインスタンスに対してグローバルに登録されている必要があります。

データの受け渡し (Props)

BladeテンプレートからVueコンポーネントへ静的なデータを渡すには、HTML属性のようにPropsを渡します。

例: Laravelコントローラーから取得したユーザー名をVueコンポーネントに渡す

まず、Laravel側でデータをビューに渡すルートとコントローラーを作成します。

php
// routes/web.php
Route::get('/greeting', function () {
$userName = 'Alice';
return view('greeting', ['userName' => $userName]);
});

“`html+jinja
{# resources/views/greeting.blade.php #}





Greeting
@vite([‘resources/js/app.js’])

{# userName変数を JSONエンコードして、HTML属性としてコンポーネントに渡す #}
{# 注意: Bladeからそのまま文字列や数値を渡すのは簡単ですが、JSONや配列など複雑なデータは JSONエンコードが必要です #}


“`

次に、Vueコンポーネント resources/js/components/GreetingComponent.vue を作成します。

“`vue

“`

そして、resources/js/app.jsGreetingComponent をグローバル登録します。

“`javascript
import ‘./bootstrap’;
import { createApp } from ‘vue’;
import GreetingComponent from ‘./components/GreetingComponent.vue’; // インポート

const app = createApp({});
app.component(‘greeting-component’, GreetingComponent); // グローバル登録
app.mount(‘#app’);
“`

これで、/greeting ルートにアクセスすると、Laravelから渡された $userName の値がVueコンポーネントに渡され、表示されるようになります。

注意点として、BladeからHTML属性として渡せるのは文字列だけです。数値や真偽値、オブジェクト、配列などを渡したい場合は、json_encode() などのPHP関数を使ってJSON文字列に変換し、Vueコンポーネント側で JSON.parse() を使ってデコードする必要があります。また、HTML属性に値を埋め込む際は、クロスサイトスクリプティング(XSS)のリスクを避けるために、LaravelのBladeの自動エスケープ機能や、json_encode と組み合わせる場合は適切に処理することが重要です。上記の例では {{ json_encode(...) }} としていますが、Bladeの {{ }} はデフォルトでエスケープするため、複雑なデータの受け渡しには工夫が必要です。より確実なのは、HTML属性として渡すのではなく、API経由でデータを取得することです。

より安全なデータ受け渡し方法

HTML属性としてデータを渡す方法は手軽ですが、複雑なデータや機密性の高いデータには向きません。推奨されるのは、ページが読み込まれた後にVueコンポーネントからLaravelのAPIエンドポイントにHTTPリクエストを送信してデータを取得する方法です。これは次の章で詳しく解説します。

第5章: バックエンドAPIの実装 (Laravel)

Vue.jsアプリケーションがLaravelバックエンドと連携する主要な手段は、API通信です。LaravelでAPIエンドポイントを作成し、データをJSON形式で提供する方法を見ていきましょう。

APIルートの定義 (routes/api.php)

Laravelでは、API用のルートは通常 routes/api.php に定義します。このファイルで定義されたルートは、RouteServiceProvider によって自動的にURLのプレフィックスとして /api が付きます。

例: ユーザーリストを取得するAPIエンドポイント

“`php
// routes/api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\UserController; // 後で作成するコントローラーをインポート

// 認証が不要な公開APIの場合
Route::get(‘/users’, [UserController::class, ‘index’]);

// 認証が必要なAPIグループの場合(例: Laravel Sanctumを使用)
// Route::middleware(‘auth:sanctum’)->group(function () {
// Route::get(‘/user’, function (Request $request) {
// return $request->user();
// });
// });
“`

この例では、/api/users へのGETリクエストに対して、App\Http\Controllers\Api\UserControllerindex メソッドを実行するようにルーティングを定義しています。

APIコントローラーの作成

APIリクエストを処理するためのコントローラーを作成します。アプリケーションのコントローラーとは分けて、App\Http\Controllers\Api のようなディレクトリに配置するのが一般的です。

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

bash
php artisan make:controller Api/UserController --api

--api オプションを付けることで、RESTfulなAPIによく使われるメソッド(index, store, show, update, destroy)だけを持つコントローラーのひな形が生成されます。

“`php
// app/Http/Controllers/Api/UserController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User; // Userモデルをインポート

class UserController extends Controller
{
/*
* Display a listing of the resource.
/
public function index()
{
// データベースからユーザーリストを取得
$users = User::all();

    // JSON形式でユーザーリストを返す
    return response()->json($users);
}

/**
 * Store a newly created resource in storage.
 */
public function store(Request $request)
{
    // ユーザー作成処理...
}

// ... other methods (show, update, destroy)

}
“`

この例では、index メソッドで User::all() を使ってデータベースから全ユーザーを取得し、response()->json($users) で取得したユーザーコレクションをJSON形式に変換してレスポンスとして返しています。

APIリソースによるデータ整形

APIから返すデータを、フロントエンドが必要とする形式に整形したい場合があります。LaravelにはAPIリソースという便利な機能があり、これを使うことで柔軟にデータを整形できます。

Artisanコマンドでリソースを作成します。

bash
php artisan make:resource UserResource

app/Http/Resources/UserResource.php というファイルが生成されます。

“`php
// app/Http/Resources/UserResource.php
namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
/*
* Transform the resource into an array.
*
* @return array
/
public function toArray(Request $request): array
{
// ここで返すデータの構造を定義
return [
‘id’ => $this->id,
‘name’ => $this->name,
‘email’ => $this->email,
‘created_at’ => $this->created_at->format(‘Y/m/d H:i’), // 日付フォーマットを変更
// 必要に応じて他の属性を追加・整形
// ‘is_admin’ => (bool) $this->is_admin,
];
}
}
“`

このリソースをコントローラーの index メソッドで使用します。ユーザーリスト全体に対してリソースコレクションを適用するには UserResource::collection() を使います。

“`php
// app/Http/Controllers/Api/UserController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use App\Http\Resources\UserResource; // UserResource をインポート

class UserController extends Controller
{
/*
* Display a listing of the resource.
/
public function index()
{
$users = User::all();

    // UserResource を使ってデータを整形して返す
    return UserResource::collection($users);
}

/**
 * Display the specified resource. (特定のユーザーを取得する場合)
 */
public function show(User $user) // ルートモデルバインディングを使用
{
    // 単一のリソースに対しては new UserResource() を使う
    return new UserResource($user);
}

}
“`

APIリソースを使うことで、データベースのスキーマ変更がAPIレスポンスの構造に直接影響を与えないようにしたり、フロントエンドが必要とする情報だけを含めたり、データのフォーマットを統一したりといったことが容易になります。

Laravel Sanctumなどを使ったAPI認証

SPAからLaravelバックエンドの保護されたAPIエンドポイントにアクセスする場合、認証メカニズムが必要です。Laravel Sanctumは、軽量なAPI認証システムを提供しており、SPA認証に特に適しています。トークンベースの認証と、Cookieベースのセッション認証の両方をサポートしています。

SPAからのAPI呼び出しには、トークンベース(APIトークンをリクエストヘッダーに含める)または、Sanctumが提供するCookieベースのセッション認証(事前にログイン処理を行い、サーバーから発行されたCSRFトークンとセッションCookieを使う)が利用できます。後者は、同じドメイン(またはSanctumの設定で許可されたサブドメイン)でLaravelとSPAをホストする場合に便利です。

Sanctumのセットアップ方法や使い方はこの記事の範囲を超えるため詳細は割愛しますが、保護が必要なAPIエンドポイントには auth:sanctum ミドルウェアを適用することを覚えておいてください。

第6章: フロントエンドからのAPIリクエスト (Vue.js & Axios)

Vue.jsアプリケーションからLaravelのAPIエンドポイントにHTTPリクエストを送信するには、AxiosのようなHTTPクライアントライブラリを使うのが一般的です。

Axiosのインストール

プロジェクトのルートディレクトリで以下のコマンドを実行してAxiosをインストールします。

bash
npm install axios # または yarn add axios

インストール後、resources/js/bootstrap.js ファイルを開いてみてください。Laravelの初期設定では、Axiosがインストールされており、window.axios としてグローバルに利用できるようになっています。

“`javascript
// resources/js/bootstrap.js
import axios from ‘axios’;
window.axios = axios;
window.axios.defaults.headers.common[‘X-Requested-With’] = ‘XMLHttpRequest’;

// … 必要に応じて CSRF トークンの設定などを行う
“`

この設定により、Vueコンポーネントのどこからでも axios を使ってHTTPリクエストを送信できます。

Vueコンポーネント内でのAPI呼び出し

Vueコンポーネント内でAPIを呼び出す典型的なパターンは、コンポーネントがマウントされたとき(mounted ライフサイクルフック)にデータを取得し、コンポーネントのデータプロパティに格納することです。

例: ユーザーリストを取得して表示するVueコンポーネント

resources/js/components/UserList.vue を作成します。

“`vue

“`

そして、この UserList コンポーネントを resources/js/app.js でグローバル登録し、Bladeテンプレートで使用します。

“`javascript
// resources/js/app.js
import ‘./bootstrap’;
import { createApp } from ‘vue’;
import UserList from ‘./components/UserList.vue’; // UserList をインポート

const app = createApp({});
app.component(‘user-list’, UserList); // グローバル登録
app.mount(‘#app’);
“`

“`html+jinja
{# resources/views/welcome.blade.php (または他のビュー) #}

{# UserList コンポーネントを配置 #}

@vite([‘resources/js/app.js’])


“`

これで、ページが表示されると同時に /api/users エンドポイントからユーザーリストが非同期で取得され、Vueコンポーネントによって表示されるようになります。

CORSとCSRF対策

CORS (Cross-Origin Resource Sharing):

フロントエンド(例: http://localhost:8000)とバックエンドAPI(例: http://localhost:8000/api/...)が同じオリジン(プロトコル、ドメイン、ポート)で提供されている場合は、CORSの設定は通常不要です。しかし、異なるオリジンで提供する場合(例: フロントエンドが http://localhost:3000、バックエンドが http://localhost:8000)、ブラウザのセキュリティ制限によりAPIリクエストがブロックされることがあります。

Laravelには、CORSを簡単に設定できる laravel/cors パッケージがあります。これは通常、Laravelプロジェクトに最初から含まれています。config/cors.php ファイルで許可するオリジンなどを設定できます。開発環境で異なるポートを使っている場合は、このファイルでフロントエンドのオリジンを許可する必要があります。

php
// config/cors.php
return [
// ...
'paths' => ['api/*', 'sanctum/csrf-cookie'], // APIルートなどでCORSを有効にする
'allowed_origins' => ['http://localhost:8000', 'http://localhost:3000'], // 許可するオリジン
'allowed_headers' => ['*'],
'allowed_methods' => ['*'],
'supports_credentials' => true, // Cookieや認証ヘッダーを許可する場合
// ...
];

CSRF (Cross-Site Request Forgery) 保護:

LaravelはWebルートに対して強力なCSRF保護を提供しています。しかし、SPAからAPIを呼び出す場合、通常はトークンベースの認証を使用するためCSRFトークンは不要ですが、SanctumのCookieベース認証を使用する場合はCSRF保護が必要です。

Sanctumを使用する場合、SPAからの初回リクエスト(例: ログインや最初のページロード)で /sanctum/csrf-cookie エンドポイントにGETリクエストを送信し、CSRFトークンを含むCookieを取得します。その後のAPIリクエストでは、取得したCookieと、Cookieから読み取ったCSRFトークンを X-CSRF-TOKEN または X-XSRF-TOKEN ヘッダーに含めて送信する必要があります。Axiosは適切に設定されていれば、これを自動的に行ってくれます。

resources/js/bootstrap.js に以下の設定が含まれていることを確認してください。

“`javascript
// resources/js/bootstrap.js
// … axios 設定

// 必要に応じて、Laravel Sanctum SPA 認証のための CSRF トークン設定
// この設定があると、axios は自動的に X-XSRF-TOKEN ヘッダーを送信します。
// Sanctum SPA 認証を使う場合は、事前に /sanctum/csrf-cookie に GET リクエストを送信してクッキーを取得しておく必要があります。
axios.defaults.withCredentials = true; // Cookieを送受信する設定
“`

SPA認証については、Laravel Sanctumの公式ドキュメントを参考に、適切なセットアップとワークフローを実装してください。

第7章: ルーティングとSPA化

アプリケーションを単一のページとして振る舞わせ(SPA化する)、クライアント側でビューの切り替えを行うには、Vue Routerのようなライブラリが必要です。LaravelのルーティングとVue Routerを連携させる方法を見ていきましょう。

Laravel側のルーティング (routes/web.php)

SPAの場合、Laravel側では、アプリケーションのエントリーポイントとなる単一のビューだけを返すようにルーティングを設定します。Vue Routerがクライアント側でURLの変更を処理するため、Laravelはすべてのフロントエンドルートリクエストに対して同じビューを返すようにします。

“`php
// routes/web.php
use Illuminate\Support\Facades\Route;

// SPA のエントリーポイントとなるビューを返す
// ‘/{any?}’ は、どんな URL パスでもこのルートにマッチさせるためのフォールバックルートです。
// ‘any’ の部分は正規表現で、スラッシュ以外の文字が0文字以上続くことを意味します。
// ->where(‘any’, ‘.‘); を追加すると、スラッシュを含む任意のパスにマッチします。
Route::get(‘/{any?}’, function () {
return view(‘app’); // Vue.js アプリケーションをマウントするビュー
})->where(‘any’, ‘.
‘); // スラッシュを含む任意のパスにマッチ

// API ルートは routes/api.php に定義されているため、ここには含めない
// ログイン、ログアウトなど、Laravel側で処理する必要がある Web ルートはここに残す場合がある
// Route::post(‘/logout’, [AuthController::class, ‘logout’])->name(‘logout’);
“`

この設定では、/api/* を除くすべてのGETリクエストが app.blade.php ビュー(後述)を返します。これにより、Vue RouterがURLを制御できるようになります。

Vue Routerを使ったフロントエンド側のルーティング

Vue Routerは、Vue.jsアプリケーション内でURLに応じて表示するコンポーネントを切り替えるためのライブラリです。

インストール:

bash
npm install vue-router@4 # または yarn add vue-router@4

Vue Routerの設定:

resources/js/router/index.js のようなファイルを作成し、ルーターインスタンスを定義します。

“`javascript
// resources/js/router/index.js
import { createRouter, createWebHistory } from ‘vue-router’;

// ルート定義
const routes = [
{
path: ‘/’,
name: ‘home’,
component: () => import(‘../views/Home.vue’) // 遅延ロード
},
{
path: ‘/about’,
name: ‘about’,
component: () => import(‘../views/About.vue’)
},
{
path: ‘/users’,
name: ‘users’,
component: () => import(‘../views/UserIndex.vue’)
},
// 404 ページなど
{
path: ‘/:catchAll(.*)’, // マッチしないすべてのパス
name: ‘notFound’,
component: () => import(‘../views/NotFound.vue’)
}
];

// ルーターインスタンス作成
const router = createRouter({
history: createWebHistory(), // HTML5 History モードを使用
routes,
});

export default router;
“`

解説:

  • createWebHistory(): HTML5 History API を使用して、URLに # が含まれないきれいなURLを実現します。Laravel側のフォールバックルート設定と組み合わせて使います。
  • routes: URLパスと表示するコンポーネントのマッピングを定義した配列です。
  • component: () => import(...): コンポーネントを遅延ロード(Lazy Load)するための構文です。これにより、アプリケーションの初期ロード時間を短縮できます。
  • /:catchAll(.*): 定義されたどのルートにもマッチしない場合に表示するページ(例: 404エラーページ)を設定するためのパスです。

Vueアプリケーションへのルーターの組み込み:

resources/js/app.js を修正し、作成したルーターインスタンスをVueアプリケーションに組み込みます。

“`javascript
// resources/js/app.js
import ‘./bootstrap’;
import { createApp } from ‘vue’;
import router from ‘./router’; // ルーターをインポート
import App from ‘./App.vue’; // ルートコンポーネント(後述)をインポート

const app = createApp({});

// ルーターをアプリケーションに組み込む
app.use(router);

// アプリケーション全体のルートコンポーネントをマウントする
app.mount(‘#app’);

// ルートコンポーネントを使用しない場合
// const app = createApp({});
// app.use(router);
// // 必要に応じてグローバルコンポーネントを登録
// app.component(‘example-component’, ExampleComponent);
// app.mount(‘#app’);
“`

通常、SPAではアプリケーション全体をラップするルートコンポーネント (App.vue など) を作成し、その中にVue Routerがビューをレンダリングするための <router-view> 要素を配置します。

“`vue

“`

そして、resources/views/app.blade.php#app 要素にこの App.vue コンポーネントをマウントするように resources/js/app.js を修正します。

“`javascript
// resources/js/app.js (修正後)
import ‘./bootstrap’;
import { createApp } from ‘vue’;
import router from ‘./router’;
import App from ‘./App.vue’; // ルートコンポーネントをインポート

const app = createApp(App); // createApp にルートコンポーネントを渡す

app.use(router);
app.mount(‘#app’);
“`

これで、Laravelが返す単一のBladeビュー上で、Vue RouterがURLに基づいてコンポーネントを切り替えるSPAが構築できます。

LaravelとVue Routerの連携方法 (Fallbackルート設定など)

createWebHistory() を使用する場合、ブラウザのアドレスバーに直接URL(例: http://localhost:8000/about)を入力してアクセスしたり、ページをリロードしたりすると、ブラウザはサーバーに対してそのURLのリソースを要求します。

SPAでない通常のアプリケーションであれば、サーバーは /about というURLに対応するページを返します。しかし、SPAの場合は、サーバーは常にVueアプリケーションのエントリーポイントとなるビュー (app.blade.php) を返す必要があります。

これを実現するのが、前述のLaravel側のFallbackルート設定です。

php
// routes/web.php
Route::get('/{any?}', function () {
return view('app');
})->where('any', '.*');

このルートは、/api で始まるURL以外の、定義された他のWebルートにマッチしないすべてのGETリクエストを捕捉し、app.blade.php ビューを返します。ブラウザは app.blade.php を受け取り、その中に含まれるJavaScript(app.js)が実行され、Vue Routerが現在のURL(例: /about)を解釈して、対応するVueコンポーネント (About.vue) を表示します。

もしこのFallbackルート設定がないと、例えば /about に直接アクセスした場合、Laravelは /about というルートが見つからないとして404エラーを返してしまい、Vueアプリケーションが起動しません。

注意点:

  • Laravel側で処理すべきWebルート(例: ログイン、ログアウトなどフォーム送信を伴うもの)がある場合は、それらをFallbackルートの前に定義する必要があります。Fallbackルートは最後にマッチするように設定します。
  • APIルートは /api/* のプレフィックスを持つため、Fallbackルート(/{any?})とは競合しません。

SPA構成のメリット・デメリット

メリット:

  • 高速なページ遷移: ページ全体のリロードが不要なため、コンポーネントの切り替えが非常に高速です。
  • リッチなユーザー体験: デスクトップアプリケーションに近い、滑らかなインタラクティブなUIを構築しやすいです。
  • サーバー負荷軽減: データ取得はAPI経由で行われるため、サーバーはHTMLのレンダリングではなくデータ提供に集中できます。
  • フロントエンドとバックエンドの明確な分離: API規約に基づいて開発が進められるため、役割分担がしやすく、開発を並行して進めやすいです。

デメリット:

  • 初期ロード時間: アプリケーションのJavaScriptバンドル全体を最初にダウンロードして実行する必要があるため、初回表示に時間がかかる場合があります(コード分割や遅延ロードで緩和可能)。
  • SEO: クライアントサイドでコンテンツがレンダリングされるため、検索エンジンのクローラーがコンテンツを正しくインデックスできない場合があります。サーバーサイドレンダリング(SSR)やプリレンダリングといった技術で対策が必要になることがあります。
  • JavaScriptが無効な環境: JavaScriptが無効なブラウザや環境では動作しません。
  • 複雑性: クライアントサイドルーティングや状態管理など、フロントエンドの複雑性が増します。

プロジェクトの要件に応じて、ページ全体をSPAにするか、ページの一部だけをVueコンポーネントにするかなどを検討してください。LaravelとVue.jsの組み合わせは、どちらの構成も柔軟に対応できます。

第8章: 状態管理 (Pinia/Vuex)

アプリケーションの規模が大きくなるにつれて、複数のコンポーネント間で共有される状態(ログインユーザー情報、カートの中身、アプリケーション設定など)を管理することが課題となります。このような場合、Vue.jsのエコシステムで広く使われている状態管理ライブラリであるVuexや、よりモダンなPiniaの導入を検討します。

なぜ状態管理が必要か

  • コンポーネント間のデータ共有: 親子関係にないコンポーネント間でデータを簡単に受け渡しできます。
  • 状態の一元管理: アプリケーション全体の状態を単一のストアで管理することで、状態の変更経路が明確になり、デバッグが容易になります。
  • 可予測な状態変化: 状態の変更をミューテーション(Piniaではアクションや直接変更)やアクションとして定義することで、いつ、どのように状態が変化したかを追跡しやすくなります。

Vue 3および新しいプロジェクトでは、Vuexの後継として開発されたPiniaが推奨されています。Piniaはよりシンプルで型安全性が高く、Composition APIとの相性が良いです。

Piniaの基本的な使い方(簡単な例)

Piniaのインストール:

bash
npm install pinia # または yarn add pinia

ストアの定義:

resources/js/stores/counter.js のようなファイルを作成します。

“`javascript
// resources/js/stores/counter.js
import { defineStore } from ‘pinia’;

export const useCounterStore = defineStore(‘counter’, {
state: () => ({
count: 0,
}),
getters: {
doubleCount: (state) => state.count * 2,
},
actions: {
increment() {
this.count++;
},
decrement() {
this.count–;
},
},
});
“`

アプリケーションへの組み込み:

resources/js/app.js を修正し、PiniaをVueアプリケーションに組み込みます。

“`javascript
// resources/js/app.js
import ‘./bootstrap’;
import { createApp } from ‘vue’;
import router from ‘./router’;
import App from ‘./App.vue’;
import { createPinia } from ‘pinia’; // Pinia をインポート

const app = createApp(App);
const pinia = createPinia(); // Pinia インスタンスを作成

app.use(router);
app.use(pinia); // Pinia をアプリケーションに組み込む

app.mount(‘#app’);
“`

コンポーネントでの利用:

Piniaストアは、コンポーネントの <script setup> または setup() メソッド内で useStore 関数を使って利用します。

“`vue

“`

この Counter.vue コンポーネントを他のコンポーネントやルートビューで使用することで、アプリケーション全体で同じ counter ストアの状態を共有・操作できます。

PiniaやVuexを使うことで、複雑な状態管理をより効率的かつ構造的に行うことができます。特にSPAで多くのコンポーネントが連携する場合にその恩恵を大きく受けられます。

第9章: 開発とデプロイメント

開発中はViteやLaravel Mixの開発サーバーとLaravelの開発サーバーを同時に起動して効率的に開発を進めます。本番環境へデプロイする際は、フロントエンド資産をビルドし、Laravelアプリケーションとともにサーバーに配置する必要があります。

開発環境でのビルドとホットリロード

開発中は以下のコマンドを実行します。

  1. Laravel開発サーバー:
    bash
    php artisan serve
  2. フロントエンド開発サーバー (Vite):
    bash
    npm run dev # または yarn dev

    または フロントエンド監視 (Laravel Mix):
    bash
    npm run watch # または yarn watch

npm run dev (Vite) や npm run watch (Mix) は、JavaScriptやCSSファイルへの変更を監視し、自動的に再コンパイルまたはホットリロードを行います。これにより、コードを変更するたびに手動でビルドし直す手間が省け、効率的に開発を進められます。

本番環境でのビルド

本番環境へデプロイする前に、フロントエンド資産を最適化してビルドする必要があります。

Vite:

bash
npm run build # または yarn build

このコマンドは、JavaScript、CSS、その他のアセットをプロダクション用に最適化してバンドルします。出力先は通常 public/build ディレクトリです。Bladeテンプレートで @vite ディレクティブを使用していれば、ビルド後のファイルへのパスが自動的に解決されます。

Laravel Mix:

bash
npm run production # または yarn production

このコマンドは、Mixの設定 (webpack.mix.js) に従ってアセットを最適化してビルドします。出力先は public/jspublic/css などMix設定で指定したディレクトリです。mix.version() を使用している場合、ファイル名にハッシュが付加され、Bladeテンプレートの @mix ディレクティブが適切なハッシュ付きのファイル名を解決します。

ビルドが成功すると、public ディレクトリ内に本番用の静的ファイル群が生成されます。これらのファイルをLaravelアプリケーションの他のコードとともにサーバーにアップロードします。

デプロイ時の注意点

デプロイ先のサーバーには、開発環境と同じバージョンのPHP、Composer、Node.jsが必要です。

  1. コードのアップロード: Laravelプロジェクトの全ファイルをサーバーにアップロードします(.env ファイルや node_modules, vendor など、ビルドやインストールで生成されるものを除く場合もありますが、最近はCI/CDでサーバー上でビルド・インストールすることも多いです)。Gitなどバージョン管理システムを使うのが一般的です。
  2. 依存関係のインストール:
    • PHP: サーバー上で composer install --no-dev を実行し、本番に必要なPHPライブラリをインストールします。
    • Node.js: サーバー上で npm install --production または yarn install --production を実行し、本番に必要なNode.jsライブラリをインストールします。
  3. フロントエンド資産のビルド: サーバー上で npm run build または yarn build を実行し、フロントエンド資産をビルドします。CI/CDパイプラインに組み込むのが理想的です。
  4. .env の設定: 本番環境用の .env ファイルをサーバーに配置します。APP_ENV=productionAPP_DEBUG=false、データベース接続情報などを適切に設定します。APP_KEY が設定されていることを確認してください。
  5. ストレージディレクトリのパーミッション: storage および bootstrap/cache ディレクトリに、Webサーバー(PHPを実行するユーザー)が書き込みできるパーミッションを設定します。
  6. アプリケーションの最適化: 以下のArtisanコマンドを実行し、アプリケーションを最適化します。
    bash
    php artisan optimize
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
  7. データベースマイグレーション: 必要に応じて php artisan migrate --force を実行し、データベース構造を更新します。
  8. Webサーバー設定: NginxやApacheなどのWebサーバーのドキュメントルートをプロジェクトの public ディレクトリに設定します。SPAの場合は、すべてのリクエストを index.php に送るように設定が必要です(Laravelのドキュメントを参照してください)。

SPA (HTML5 History モード) のWebサーバー設定例 (Nginx):

“`nginx
server {
listen 80;
server_name yourdomain.com;
root /path/to/your/laravel-vue-app/public;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";

index index.php;

charset utf-8;

location / {
    try_files $uri $uri/ /index.php?$query_string; # これが重要
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; # PHP-FPM のソケットパスを環境に合わせて変更
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    include fastcgi_params;
}

location ~ /\.(?!well-known).* {
    deny all;
}

}
“`

try_files $uri $uri/ /index.php?$query_string; の設定により、存在しないファイルへのリクエスト(Vue Routerが扱うURLなど)はすべて index.php に送られ、Laravelアプリケーション(そしてVue Router)が処理するようになります。

第10章: 次のステップと関連技術

LaravelとVue.jsを連携させる基本的な方法を学びましたが、さらに高度な開発を行うための関連技術や考慮すべき点があります。

  • Laravel Breeze / Jetstream: 認証機能(ログイン、登録、パスワードリセット、メール検証など)をすぐに使える形で提供するLaravel公式のスターターキットです。Vue.jsを使ったフロントエンドのスタックも選択できるため、ゼロから認証機能を実装する手間を省きたい場合に非常に役立ちます。
  • Inertia.js: Laravelのような従来のサーバーサイドレンダリングフレームワークと、Vue.jsのようなクライアントサイドSPAフレームワークの橋渡しをするライブラリです。コントローラーから直接Vueコンポーネントをレンダリングでき、APIルートを手動で定義する手間を省きつつ、SPAのような体験を実現できます。SPA開発をよりシンプルにしたい場合に検討する価値があります。
  • Testing: PHPUnitを使ったLaravelバックエンドのテストと、JestやVue Test Utilsを使ったVue.jsフロントエンドのテストを組み合わせることで、アプリケーション全体の品質を保証できます。
  • TypeScript: Vue.js開発にTypeScriptを導入することで、コードの型安全性を高め、大規模開発における保守性を向上させることができます。
  • CSSフレームワーク: Tailwind CSS, Bootstrap, Bulmaなど、Vue.jsと組み合わせて使いやすいCSSフレームワークは多数あります。Laravel BreezeやJetstreamはTailwind CSSをデフォルトで採用しています。
  • UIライブラリ: Vuetify, Element Plus, Naive UIなど、事前に構築されたUIコンポーネントを提供するライブラリを利用することで、開発速度を向上させることができます。

これらの技術を学ぶことで、より効率的で堅牢なLaravel + Vue.jsアプリケーションを開発できるようになります。

まとめ

この記事では、LaravelとVue.jsを連携させてWebアプリケーション開発を始めるための手順を詳細に解説しました。開発環境の準備から始め、Laravelプロジェクトのセットアップ、Vue.jsの導入(Laravel MixとViteの両方に触れつつViteを主軸に)、BladeテンプレートとVueコンポーネントの連携、API通信の実装(LaravelでのAPI作成とVue.jsからの呼び出し、CORS/CSRF対策)、Vue Routerを使ったクライアントサイドルーティングによるSPA化、状態管理(Piniaの紹介)、そして開発・デプロイメントの注意点について、具体的なコード例とともに説明しました。

Laravelの堅牢なバックエンド機能とVue.jsの柔軟なフロントエンド構築能力を組み合わせることで、様々な要件に対応できる強力なWebアプリケーションを開発できます。両者の連携方法を理解することは、現代のWeb開発において非常に価値があります。

今回解説した内容は、Laravel + Vue.js開発の基本的な出発点です。ここから、認証機能の実装、より複雑な状態管理、リアルタイム通信(WebSocket)、テストの導入、CI/CDパイプラインの構築など、様々な要素を加えていくことで、本格的なアプリケーションへと発展させていくことができます。

この記事が、あなたがLaravelとVue.jsを使った開発を始めるための一助となれば幸いです。ぜひ、実際に手を動かしてコードを書きながら学習を進めてください。

更なる学習リソース:

これらの公式ドキュメントを参照しながら、さらに理解を深めていくことをお勧めします。


【文字数確認】

(文字数カウントの結果が約5000語になるように調整しています。実際の文字数は環境によって若干変動します。)

【注意事項】

  • この記事のコード例は、Laravel 10または11、Vue 3、Viteを前提としています。バージョンが異なる場合、一部手順やコードが異なる可能性があります。
  • 開発環境やOSによって、ツールのインストール方法やコマンドの実行結果が異なる場合があります。
  • セキュリティに関する記述(CORS, CSRF, API認証など)は基本的な内容に留まります。本番環境での実装にあたっては、公式ドキュメントを参照し、十分なセキュリティ対策を講じてください。
  • 約5000語という指定のため、各セクションを詳細に記述しましたが、特定のトピック(認証、テスト、SSRなど)については入門レベルの紹介に留めています。必要に応じてさらに深く学習してください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール