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

いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンYuta Matsumura
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築Masashi Shinbara
 
CH02 API Governance
CH02 API Governance CH02 API Governance
CH02 API Governance Rick Hwang
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)NTT DATA Technology & Innovation
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
5分でわかるGoのポインタ
5分でわかるGoのポインタ5分でわかるGoのポインタ
5分でわかるGoのポインタY N
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いota42y
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法yoku0825
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021Yusuke Suzuki
 
微服務對IT人員的衝擊
微服務對IT人員的衝擊微服務對IT人員的衝擊
微服務對IT人員的衝擊Philip Zheng
 
設計品質とアーキテクチャ
設計品質とアーキテクチャ設計品質とアーキテクチャ
設計品質とアーキテクチャToru Koido
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介JustSystems Corporation
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門icchy
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Takahiko Ito
 
このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019 このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019 sasezaki
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)Chen Cheng-Wei
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 

What's hot (20)

いまさら学ぶMVVMパターン
いまさら学ぶMVVMパターンいまさら学ぶMVVMパターン
いまさら学ぶMVVMパターン
 
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築レイヤードアーキテクチャを意識したPHPアプリケーションの構築
レイヤードアーキテクチャを意識したPHPアプリケーションの構築
 
CH02 API Governance
CH02 API Governance CH02 API Governance
CH02 API Governance
 
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
ひと漕ぎで二度おいしい!? Flutterを使ったモバイルアプリ開発への期待と実態と付き合い方(NTTデータ テクノロジーカンファレンス 2020 発表資料)
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
5分でわかるGoのポインタ
5分でわかるGoのポインタ5分でわかるGoのポインタ
5分でわかるGoのポインタ
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法MySQLで論理削除と正しく付き合う方法
MySQLで論理削除と正しく付き合う方法
 
マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021マイクロサービスに至る歴史とこれから - XP祭り2021
マイクロサービスに至る歴史とこれから - XP祭り2021
 
微服務對IT人員的衝擊
微服務對IT人員的衝擊微服務對IT人員的衝擊
微服務對IT人員的衝擊
 
設計品質とアーキテクチャ
設計品質とアーキテクチャ設計品質とアーキテクチャ
設計品質とアーキテクチャ
 
ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介ジャストシステムJava100本ノックのご紹介
ジャストシステムJava100本ノックのご紹介
 
シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
Elasticsearch の検索精度のチューニング 〜テストを作って高速かつ安全に〜
 
このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019 このPHP QAツールがすごい!2019
このPHP QAツールがすごい!2019
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Docker Tokyo
Docker TokyoDocker Tokyo
Docker Tokyo
 
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
CI、CD、Automation你還沒準備好!?(Agile Tour Kaohsiung 2017)
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 

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 單頁面應用與前後端分離開發