PHP 與 Vue.js 結合是構建現代 Web 應用的流行技術棧,通常采用?前后端分離架構。以下是關鍵要點和推薦實現方案:
一、技術棧組合
角色 | 技術選項 |
---|---|
后端 (PHP) | Laravel (推薦)、Symfony、CodeIgniter |
前端 (Vue) | Vue 2/3、Vue Router、Pinia/Vuex、Vite |
通信協議 | RESTful API 或 GraphQL |
構建工具 | Vite (推薦) 或 Webpack |
二、兩種整合方式
1.?完全分離(主流推薦)
-
后端 PHP:僅提供 API 接口(如 Laravel 的?
api.php
?路由)。 -
前端 Vue:獨立 SPA 應用,通過 AJAX 調用 API。
-
優勢:前后端獨立開發部署,易擴展(如移動端復用 API)。
-
部署:
-
PHP 部署在?
api.domain.com
-
Vue 部署在靜態服務器(如 Nginx / CDN)
-
2.?混合渲染(漸進式整合)
-
場景:舊 PHP 項目逐步引入 Vue。
-
方式:
-
PHP 輸出基礎 HTML 模板(如 Laravel Blade)。
-
在指定 DOM 節點掛載 Vue 組件:
php
<!-- Blade 模板 --> <div id="app"><!-- Vue 將接管這里 --></div> <script src="{{ asset('js/vue-app.js') }}"></script>
-
三、工作流程示例(Laravel + Vue 3)
后端準備(Laravel API)
-
創建 API 路由:
php
// routes/api.php use App\Http\Controllers\UserController; Route::get('/users', [UserController::class, 'index']);
-
控制器返回 JSON:
php
// app/Http/Controllers/UserController.php public function index() {return response()->json(['users' => User::all()]); }
前端開發(Vue 3)
-
創建 Vue 項目(獨立目錄):
bash
npm create vue@latest
-
調用 API(使用 Axios):
vue
<!-- src/views/UserList.vue --> <script setup> import { ref } from 'vue'; import axios from 'axios';const users = ref([]); axios.get('https://api.yoursite.com/users').then(response => users.value = response.data.users); </script><template><ul><li v-for="user in users" :key="user.id">{{ user.name }}</li></ul> </template>
四、關鍵配置項
跨域問題(CORS)
-
Laravel 解決方案:安裝?
fruitcake/laravel-cors
?包并配置:php
// config/cors.php 'paths' => ['api/*'], 'allowed_origins' => ['https://your-vue-domain.com'],
認證機制
-
推薦:JWT(JSON Web Tokens)
-
PHP 庫:
php-open-source-saver/jwt-auth
-
Vue 端:Axios 攔截器添加?
Authorization
?頭
-
五、優化建議
-
API 文檔:使用 Swagger(Laravel 包:
darkaonline/l5-swagger
)。 -
狀態管理:復雜應用用 Pinia 替代 Vuex。
-
SSR 需求:用 Nuxt.js 替代 Vue(PHP 仍提供 API)。
-
部署加速:
-
Vue:
npm run build
?生成靜態文件托管至 CDN。 -
PHP:啟用 OpCache,使用隊列異步處理任務。
-
六、模板項目推薦
-
Laravel Vue SPA(一體化配置)
-
Vite + Vue + PHP Starter
七、常見問題
-
SEO 問題:Vue SPA 需配合 Prerender 或遷移至 Nuxt.js。
-
CSRF 保護:混合渲染時在 Blade 模板中添加:
html
<meta name="csrf-token" content="{{ csrf_token() }}">
Vue 中通過 Axios 讀取:
javascript
axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').content;
通過這種架構,PHP 專注于業務邏輯與數據安全,Vue 負責交互體驗,兩者通過清晰 API 邊界協作,兼顧開發效率與應用性能。