Building a Vue SPA with Laravel

PHP:7.2

Laravel:7.2

由於 Laravel 可以結合 Vue 使用,當然也可以在 Laravel 上建立 SPA(Single Page Application)

JavaScript & CSS Scaffolding

Laravel 7.2 中,Laravel 已經將前端框架的套件拆出去,因此像 VueReactBootstrap 等套件在預設的 package.json 中是沒有的。

如果要使用,就必須再透過 composer require laravel/ui

composer require laravel/ui

安裝完成以後,就可以透過 Artisan 來安裝你想要的套件。

; package.json 新增套件,resources/js/app.js 也會新增基本的 init 設定
php artisan ui bootstrap
php artisan ui vue
php artisan ui react

; 加入 auth 參數的話,會自動產生登入頁面
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth

由於這篇討論的是 Vue,因此只要安裝 Vue 的就可以了。

Router

要使用 SPA 架構,就需要安裝 Vue Router 來控制 routing

安裝 Vue Router

npm install vue-router --save-dev

Single Page Application

當套件備齊以後,要建立一個完整 SPA 有幾個地方要調整。

  • Vue Page Components
  • Vue Router Setting
  • Vue App Init
  • Laravel Blade Setting
  • Laravel Route Setting
Vue Page Components

Vue 的結構就是由各個 Components 組成,因此一開始要建立各個頁面的 Component

我們可以在 resources/js/components 當中先建立 HomeCategory 頁面。

Home.vue(Category 可以比照辦理)

<template>
  <div class="container">
    <div class="row justify-content-center">
      <div class="col-md-8">
        <div class="card">
          <div class="card-header">Home</div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    console.log('Component mounted.')
  }
}
</script>
Vue Router Setting

在頁面的 Component 完成以後,可以開始設定 Vue Router

可以在 resources/js 下建立一支 router.jsComponent

router.js

import Vue from 'vue';
import Router from 'vue-router';

// 引用頁面的 Component
import home from './components/Home.vue';
import category from './components/Category.vue';

// 使用 Vue Router
Vue.use(Router);

// Route 設定
export const routes = [
  { path: '/home', component: home, name:'home'},
  { path: '/category', component: category, name: 'category'},
  { path: '*', redirect: '/home' },
];

// 建立 Vue Router instance
const router = new Router({
  mode: 'history',
  routes
});

export default router;
Vue App Init

在頁面及 route 都準備好之後,修改 resources/js/app.js,將上一步的 Router Component 代入。

app.js

import Vue from 'vue';
import router from './router.js';

export default new Vue({
  el: '#app',
  router
});
Laravel Blade Setting

Vue 的部份都設定完成以後,要在 Laravel Blade 的頁面中引入 Vue 物件。

Notice: 範例使用預設的 welcome.blade.php

resources/views/welcome.blade.php

...
<div class="flex-center position-ref full-height">
  <div class="content">
    <div id="app">
      <div class="links">
        <!-- 建立 Vue Router 連結-->
        <router-link to="/home">Home</router-link>
        <router-link to="/category">Category</router-link>
      </div>
      <!-- Vue Router 代入的內容 -->
      <router-view></router-view>
    </div>
  </div>
</div>
<!-- 引入 Vue app -->
<script src="/js/app.js"></script>
...
Laravel Route Setting

最後一個步驟,就是將 Laravel 所有 route 都指向 welcome.blade.php

routes/web.php

// 將除了 api prefix 的 request 都導向 welcome.blade.php
Route::get('/{path}', function () {
    return view('welcome');
})->where('path', '^((?!api).)*$');

Final Check

注意一下是否已經做了 npm install,接著只要下 npm run watch 進行編譯後,就可以測試是否成功了。

Categories: LaravelVue