SlideShare a Scribd company logo
1 of 78
Maras Chen
Maraschen@codingweb.tw
Laravel 單頁面應用與前後端分離開發
• Maras Chen
• 4Gamers 後端工程師
• https://codingweb.tw
• maraschen@codingweb.tw
• C# / PHP / Python
LaravelConf2017
摘要
1.什麼是 SPA
2.Laravel API 開發
3.Laravel API 開發 Packages
LaravelConf2017
4. Laravel x Vue
5. 地雷分享
6. Laravel 5.5 New Artisan
什麼是 SPA ?
LaravelConf2017
LaravelConf2017
什麼是 SPA ?
• Single Page Application
• 中文譯名「單頁式應用程式」
• 只在一個頁面中完成動作
LaravelConf2017
圖片來源: https://msdn.microsoft.com/en-us/magazine/dn463786.aspx LaravelConf2017
SPA 優點
• 頁面能更快的被呈現出來
• UX 大幅提升
• 降低資料傳輸
• APP、Web前端 不用重複開發
LaravelConf2017
SPA 缺點
• SEO 問題
• 舊型瀏覽器不支援
LaravelConf2017
為什麼我們需要 ?
• 前端/後端不維護相同專案
• 前/後端可以不用互相了解程式碼資料夾結構
• 讓後端只需要顧好 Request 資料處理與商業邏輯
• 讓前端選擇自己的前端框架
LaravelConf2017
前端與後端的分工
LaravelConf2017
傳統工作示意圖
LaravelConf2017
• HTML
• CSS
• Javascript
• RWD
• PHP
• Database
• Server後端 全端工程師
設計師
• Illustrator
• photoshop
• flash
• HTML
• CSS
• RWD
串資料是我們 所以資料出不來或掛掉都是我們
LaravelConf2017
後端工程師要的很簡單 就只是…
LaravelConf2017
LaravelConf2017
最棒的一點就是 …
LaravelConf2017
可以讓前端自己串資料
LaravelConf2017
當有前/後端透過SPA分工後
LaravelConf2017
工作內容
• PHP
• Database
• Server
當資料出問題…
後端工程師
前端工程師
工作內容
• CSS
• Javascript
• RWD
請後端工程師修復
當設計或是畫面出問題…
請前端工程師修復
透過文件溝通
開發流程
透過技術文件溝通
設計 Wireframe
後端工程師
前端工程師 LaravelConf2017
技術文件的溝通
LaravelConf2017
• APIDOC
• http://apidocjs.com/
• Sample code:
• https://goo.gl/dDN8oy
• Demo
• https://goo.gl/NccwQ1
LaravelConf2017
LaravelConf2017
後端總是開發的很慢?
1. 可以先拿 example response 來串接API - http://myjson.com/
2. 前端遵循 restful 方式串接API - https://github.com/typicode/json-server
LaravelConf2017
LaravelConf2017
Laravel API 開發 STEP 1 (TDD)
LaravelConf2017
Laravel API 開發 STEP 2 (Provider)
LaravelConf2017
Laravel API 開發 STEP 3 (Route)
LaravelConf2017
API 認證及授權
• JSON Web Tokens (JWT)
• OAuth2 授權 – Laravel5.3-Passport
LaravelConf2017
JSON Web Token 認證
LaravelConf2017
圖片來源:https://auth0.com/blog/cookies-vs-tokens-definitive-guide/
JSON Web Token 組成
LaravelConf2017https://jwt.io
Laravel 5.2 API 認證
• Laravel 5.2+ 提供 guard web、api 認證
1. 需要先在 User 建立 api_token 欄位
2. 接著用 seeder 或是在會員註冊的時候生成一個 60 碼隨機字串
3. 在 call 受保護的 api 時傳入參數 api_token 或是 header 帶 Bearer
<api_token>
LaravelConf2017
Laravel 5.2 API 認證 - API 開發 STEP 1 (TDD)
LaravelConf2017
Laravel 5.2 API 認證 - API 開發 STEP 2 (Route)
LaravelConf2017
Laravel 5.3 - API 認證與授權 - Passport
• Laravel 5.3+ 整合了 OAuth2-Server – Passport
• Authorization Code Grant Flow
• Implicit Grant Flow
• Resource Password Owner Grant Flow
LaravelConf2017
OAuth2 認證
• Laravel 5.3 以後提供 Passport 用法
• 可以參考一下這篇教學
https://goo.gl/7wJ4Wr
LaravelConf2017
Passport OAuth2 測試怎麼寫 …
LaravelConf2017
Laravel Passport Testing - ActingAs
LaravelConf2017
Laravel API 套件
LaravelConf2017
Dingo
• 更複雜的需求?
• Content Negotiation (內容協商)
• Multiple Authentication Adapters (支援多種認證)
• API Versioning (版本控制)
• Rate Limiting (速率限制)
• Response Transformers and Formatters (統一格式回傳)
• Error and Exception Handling (錯誤及例外處理)
• Internal Requests (內部請求)
• API Blueprint Documentation (API 文件產生)
LaravelConf2017
Multiple Authentication Adapters
• Specific Authentication Providers
• Custom Authentication Providers
• Multiple Authentication Providers
• Http Basic
• JSON Web Tokens
• OAuth 2.0
LaravelConf2017
API Versioning
API 路由版本定義
LaravelConf2017
Response Transformers and Formatters
LaravelConf2017
API Blueprint Documentation
LaravelConf2017
Laravel x Vuejs
• Laravel5.3+ 預設可以在專案中安裝 bootstrap + vue + axios + jquery
LaravelConf2017
LaravelConf2017
axios
LaravelConf2017
Vuex
• 狀態管理模式 – 集中式儲存組件狀態
• 適用於中大型 SPA 專案
LaravelConf2017
LaravelConf2017
LaravelConf2017
LaravelConf2017
實際上線地雷案例
LaravelConf2017
LaravelConf2017
● CORS (跨來源資源共享) - 受同源政策影響
● X-Rate-Limit-Limit (頻率限制)
● SEO (搜尋引擎最佳化)
同源政策 (Same-origin policy)
https://a.com
https://a.com https://b.com
CORS – 在後端解決
• 套件
• https://github.com/barryvdh/laravel-cors
LaravelConf2017
CORS – 前端解決 (Vue2)
LaravelConf2017
來源參考(如何在 Vue-CLI 建立的開發環境呼叫跨域遠端 RESTful APIs): https://kuro.tw/
Local Only!!
X-RateLimit-Limit
LaravelConf2017
SEO – Prerender service
• Prerender.io (https://prerender.io)
• 免費 250 個頁面
• 開源 (https://github.com/prerender)
Request Nginx Crawler?
Prerender.io
Application
Yes
No
LaravelConf2017
SEO – Server side render
LaravelConf2017
LaravelConf2017
LaravelConf2017
LaravelConf2017
總結
LaravelConf2017
• 對於前端工程師
• 可以選擇 Javascript 框架(VueJS、reactJS、angularJS )
• 取得資料後的頁面應用
• 對於後端工程師
• 不需要管畫面 僅管測試及邏輯通過 當一個真正的全端後端工程師
• 可以不用再被前端凹了
可以更專注在後端工程的應用(資料存取、商業邏輯)
LaravelConf2017
前後端工程師缺一不可
LaravelConf2017
如果沒有前端 ....
LaravelConf2017
如果沒有後端 ....
LaravelConf2017
LaravelConf2017
LaravelConf2017
http://spa-demo.codingweb.tw/
設計 API 要很謹慎
LaravelConf2017
案例分享 – 某單位可任意使用者修改密碼
• 可任意修改其他使用者的密碼,進而查看其他使用者個資、使用
記錄,註冊/刪除卡片。
https://zeroday.hitcon.org/vulnerability/ZD-2017-00300
LaravelConf2017
LaravelConf2017
Laravel 5.5 New Artisan
LaravelConf2017
LaravelConf2017
LaravelConf2017
Source Code
• Single Page Application (Laravel+VueJS) sample code:
• Backend(Laravel5.4+dingo): https://github.com/Maras0830/spa-example-with-laravel-vue-backend
• Frontend(Vue2): https://github.com/Maras0830/spa-example-with-laravel-vue-frontend
• Frontend(Nuxtjs): https://github.com/Maras0830/spa-example-with-laravel-vue-frontend-nuxtjs
• APIDoc: https://github.com/Maras0830/spa-example-with-laravel-vue-doc
LaravelConf2017
Q&A
LaravelConf2017
END
LaravelConf2017

More Related Content

What's hot

NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020gree_tech
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTipsKenjiro Kubota
 
ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要TomomitsuKusaba
 
飛び道具ではないMetal #iOSDC
飛び道具ではないMetal #iOSDC飛び道具ではないMetal #iOSDC
飛び道具ではないMetal #iOSDCShuichi Tsutsumi
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐkwatch
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南Mikiya Okuno
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話JustSystems Corporation
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!Will Huang
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~真乙 九龍
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring土岐 孝平
 
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについてSEGADevTech
 
kintoneアプリをjavascriptでいじってみよう
kintoneアプリをjavascriptでいじってみようkintoneアプリをjavascriptでいじってみよう
kintoneアプリをjavascriptでいじってみようKyouhei Kitagawa
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス増田 亨
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向Shengyou Fan
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話JustSystems Corporation
 
Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Will Huang
 

What's hot (20)

NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020NuxtJS + SSRで作ったGREE Tech Conference 2020
NuxtJS + SSRで作ったGREE Tech Conference 2020
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
 
ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要ASP. NET Core 汎用ホスト概要
ASP. NET Core 汎用ホスト概要
 
飛び道具ではないMetal #iOSDC
飛び道具ではないMetal #iOSDC飛び道具ではないMetal #iOSDC
飛び道具ではないMetal #iOSDC
 
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐO/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
 
データベース設計徹底指南
データベース設計徹底指南データベース設計徹底指南
データベース設計徹底指南
 
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
 
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
進擊的前端工程師:今天就用 JSON Server 自己打造 API 吧!
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
自宅ラック勉強会 2.2 夏のZabbix特別教室 ~構築編~
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて
開発もQAも自動テスト!「LOST JUDGMENT:裁かれざる記憶」のQAテスター参加で進化した「テスト自動化チーム(仮)」の取り組みについて
 
kintoneアプリをjavascriptでいじってみよう
kintoneアプリをjavascriptでいじってみようkintoneアプリをjavascriptでいじってみよう
kintoneアプリをjavascriptでいじってみよう
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
 
Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
PHP 語法基礎與物件導向
PHP 語法基礎與物件導向PHP 語法基礎與物件導向
PHP 語法基礎與物件導向
 
Zabbix概論
Zabbix概論Zabbix概論
Zabbix概論
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)Micro-frontends with Angular 10 (Modern Web 2020)
Micro-frontends with Angular 10 (Modern Web 2020)
 

Similar to LaravelConf Taiwan 2017 單頁面應用與前後端分離開發

給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由Shengyou Fan
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能Shengyou Fan
 
Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片Shengyou Fan
 
開發環境建置
開發環境建置開發環境建置
開發環境建置Shengyou Fan
 
国际图象互操作框架(IIIF) APIs和应用实例
国际图象互操作框架(IIIF)  APIs和应用实例 国际图象互操作框架(IIIF)  APIs和应用实例
国际图象互操作框架(IIIF) APIs和应用实例 Marcia Zeng
 
使用 RxJava 让数据流动 (Let data streaming using rxjava)
使用  RxJava 让数据流动 (Let data streaming using rxjava)使用  RxJava 让数据流动 (Let data streaming using rxjava)
使用 RxJava 让数据流动 (Let data streaming using rxjava)Tankery Chen
 
Laravel - 簡介與環境設定
Laravel - 簡介與環境設定Laravel - 簡介與環境設定
Laravel - 簡介與環境設定Vincent Chi
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发topgeek
 
Laravel 5.2 教學
Laravel 5.2 教學Laravel 5.2 教學
Laravel 5.2 教學Cloud Wu
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用Shengyou Fan
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Mu-Fan Teng
 
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹Shengyou Fan
 
单页面开发遇到的一些问题
单页面开发遇到的一些问题单页面开发遇到的一些问题
单页面开发遇到的一些问题Zhi Zhong
 
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 TaiwanAlan Tsai
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南Shengyou Fan
 
SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)毅 吕
 
PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServHt Wang
 

Similar to LaravelConf Taiwan 2017 單頁面應用與前後端分離開發 (20)

給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由給你一個使用 Laravel 的理由
給你一個使用 Laravel 的理由
 
Route 機制
Route 機制Route 機制
Route 機制
 
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
[WebConf Taiwan 2023] 一份 Zend Engine 外帶!透過 Micro 讓一次打包、多處運行變得可能
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
驗證與訊息
驗證與訊息驗證與訊息
驗證與訊息
 
Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片Laravel installfest 工作坊 投影片
Laravel installfest 工作坊 投影片
 
開發環境建置
開發環境建置開發環境建置
開發環境建置
 
国际图象互操作框架(IIIF) APIs和应用实例
国际图象互操作框架(IIIF)  APIs和应用实例 国际图象互操作框架(IIIF)  APIs和应用实例
国际图象互操作框架(IIIF) APIs和应用实例
 
使用 RxJava 让数据流动 (Let data streaming using rxjava)
使用  RxJava 让数据流动 (Let data streaming using rxjava)使用  RxJava 让数据流动 (Let data streaming using rxjava)
使用 RxJava 让数据流动 (Let data streaming using rxjava)
 
Laravel - 簡介與環境設定
Laravel - 簡介與環境設定Laravel - 簡介與環境設定
Laravel - 簡介與環境設定
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发
 
Laravel 5.2 教學
Laravel 5.2 教學Laravel 5.2 教學
Laravel 5.2 教學
 
Package 安裝與使用
Package 安裝與使用Package 安裝與使用
Package 安裝與使用
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰
 
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
COSCUP 2016 Laravel 部署工作坊 - 生態圈介紹
 
单页面开发遇到的一些问题
单页面开发遇到的一些问题单页面开发遇到的一些问题
单页面开发遇到的一些问题
 
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan
探索 API 開發的挑戰與解決之道 | .NET Conf 2023 Taiwan
 
COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南COSCUP 2016 Laravel 部署工作坊 - 部署指南
COSCUP 2016 Laravel 部署工作坊 - 部署指南
 
SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)
 
PHP & AppServ
PHP & AppServPHP & AppServ
PHP & AppServ
 

LaravelConf Taiwan 2017 單頁面應用與前後端分離開發