Laravel11とVue3の連携方法を解説します。
LaravelとVueを連携させたいときに、参考にしてください♪
Laravel11とVue3の連携方法:カウンタを作ってみる
まずは、Laravelのプロジェクトを作成します。
Laravelプロジェクト作成&Breeze認証インストール
Laravelのプロジェクト作成方法は色々ありますが、今回はxampp(ザンプ)を使いました。
下記コマンドでプロジェクトを作ります。
| 
					 1  | 
						composer create-project --prefer-dist laravel/laravel vuetest  | 
					
cdコマンドでvuetestに移動します。Breezeライブラリをインストールします。
| 
					 1  | 
						composer require laravel/breeze --dev  | 
					
| 
					 1  | 
						php artisan breeze:install  | 
					
データベースの作成と設定も必要です。
インストールやデータベース作成について、詳細は下記ご覧ください。
プラグインのインストール
次に下記コマンドを実行して、プラグインをインストールします。
| 
					 1  | 
						npm install --save-dev @vitejs/plugin-vue  | 
					
vite.config.jsの変更
vite.config.jsファイルに、下記のようにコードを追加します。
【vite.config.js】
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  | 
						import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; // 追加 import vue from '@vitejs/plugin-vue'; export default defineConfig({     plugins: [         laravel({             input: [                 'resources/css/app.css',                 'resources/js/app.js',             ],             refresh: true,         }),         // 追加         vue({             template: {                 transformAssetUrls: {                     base: null,                     includeAbsolute: false,                 },             },         }),     ],    // 追加     resolve: {          alias: {             vue: 'vue/dist/vue.esm-bundler.js',         },     }, });  | 
					
Vueのエイリアスを vue/dist/vue.esm-bundler.js に設定することで、開発時にVueのテンプレートをリアルタイムでコンパイルできます。
Vueファイルの作成
resources/jsの中に、componentsを作り、その中に、TestComponent.vueファイルを作ります。下記のコードをいれます。今回は従来のOptions APIでコードを書きました。
【TestComponent.vue】
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  | 
						<template>   <button v-on:click="counter" class="btn">数字:{{count}}</button> </template> <script> export default {   data() {     return {       count: 1     }   },   methods: {     counter() {       this.count++;     }   } } </script> <style scoped> .btn {     background-color: blue;     color: white;     padding: 10px 20px;     border: none;     border-radius: 5px; } </style>  | 
					
app.jsの変更
resoures/js/app.jsの中に、下記のコードを追加します。
【app.js】
| 
					 1 2 3 4 5 6 7  | 
						// 追加 import { createApp } from 'vue'; import TestComponent from './components/TestComponent.vue'; const app = createApp({}); app.component('test-component', TestComponent); app.mount('#app');  | 
					
app id属性の設定
resources/views/layouts/app.blade.phpの中のbody開始タグの中に、id=”app”を追加します。
【app.blade.php】
| 
					 1 2 3  | 
						    </head>     <body class="font-sans antialiased" id="app">         <div class="min-h-screen bg-gray-100">  | 
					
Vueファイル埋め込みの設定
作成したビューファイルは、ダッシュボードファイルの中に埋め込みます。resources/views/dashboard.blade.phpの中に、<test-component></test-component>コードを追加します。
【dashboard.blade.php】
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | 
						<x-app-layout>     <x-slot name="header">         <h2 class="font-semibold text-xl text-gray-800 leading-tight">             {{ __('Dashboard') }}         </h2>     </x-slot>     <div class="py-12">         <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">             <div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">                 <div class="p-6 text-gray-900">                     {{-- 追加 --}}                     <test-component></test-component>                 </div>             </div>         </div>     </div> </x-app-layout>  | 
					
ブラウザで確認
ブラウザで動作を確認します。まず、/registerでユーザー登録します。ログイン後のダッシュボードで、次のようにカウンタが表示されます。


ボタンをクリックすると、数字が増えていくのを確認してください。
もしロゴが大きく表示される場合には、vite.config.jsに下記を加えます。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
						import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; // 追加 import vue from '@vitejs/plugin-vue'; export default defineConfig({     plugins: [         laravel({             input: [                 'resources/css/app.css',                 'resources/js/app.js',             ],             refresh: true,         }),         // 追加         vue({             template: {                 transformAssetUrls: {                     base: null,                     includeAbsolute: false,                 },             },         }),     ],     resolve: {          alias: {             vue: 'vue/dist/vue.esm-bundler.js',         },     },     // 画像が大きくなったりしたときはこちら     server: {         hmr: {             host: 'localhost',         },     }, });  | 
					
追記:Property “open” was accessed during render but is not defined on instanceエラー対策
上記の手順でコードを入力すると、コンソールに下記エラーがでます。

これは、body タグ内にid=”app”をいれたためです。bodyタグにid=”app”をいれると、body全体がVue.jsの管理下に入ります。
ですがLaravelには、デフォルトでlayouts/navigation.blade.php内にAlpine.jsのコードが組み込まれています。具体的には、下記コードです。
| 
					 1  | 
						<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">  | 
					

このコードがVue.jsのインスタンス内で不適切に解釈され、エラーになってしまいます。
コンソールエラーを消したい場合は、今回であれば、app.blade.phpではなく、dashboard.blade.phpファイル内のdivタグの中にid=”app”を設定しましょう。
これにより、Vue.js と Alpine.js のコードが干渉せず、それぞれが独立して機能するようになります。
【dashboard.blade.php】
| 
					 1 2 3  | 
						                    <div class="p-6 text-gray-900" id="app">                         <test-component></test-component>                     </div>  | 
					
さいごに
以上、LaravelとVue連携について解説しました。
今回はプロジェクトの一部でVue.jsを使いました。プロジェクト全体でVueをメインに使いたい場合には、イナーシャというライブラリが便利です。
なお「Vue.jsを覚えるのは面倒」という場合には、Livewireがおすすめです。
Livewireを使うと、blade.phpファイルに記述しつつ、Vue.jsのような機能を搭載できます。ご興味あれば、Livewireの記事も見てみてください。

Vue.jsやLivewireを取り入れることで、Webアプリにインタラクティブな機能を追加できます。必要な時に、取り入れてみてくださいね。
  
  
  
  




