# LaravelConf2017 筆記 *Lumen也是個好東西......* ## 大會共筆 [連結](https://hackmd.io/c/HJ-0vTLX-/https%3A%2F%2Fhackmd.io%2FKYTgJgbADAHAxgZgLQEMDs8kBYVbUkFAJmTDTEJAFYAzNOKsIA%3D%3D) https://laravelconf.tw/zh-TW/schedule ## 從快速成長的新創企業發展角度談 iFit x ECFIT 導入開發框架 Laravel 時的思維與歷程 - 故事與過程 - 為何要引入框架 - 引入過程 - 循序漸進、由簡入繁、有目的性地進行-可長可久的專案 - 現有服務的網站或系統優先導入 - 公司內部優先導入 - 開發時程不緊迫的優先導入 - 需要協同作業的優先導入 - 小型短期不導入 - MVP 專案不導入 - 案例 - 自行開發框架 ## Storage X GCS * 開始使用 * 管理靜態檔案的統一介面 ```php= use Illuminate\Support\Facades\Storage; Storage::method(); Storage::disk()->method() ``` * 也可以利用 Resolver * [GCS](https://console.cloud.google.com/networking/dns/zones?project=cramschool-1227) * [套件](https://github.com/Superbalist/laravel-google-cloud-storage) - 跨平台配置 - 設定load balance(設定圖片的domain) * [Load Balance](https://zh.wikipedia.org/wiki/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1):負載平衡服務,是一種技術 通常是由專用軟體和硬體來完成。 * 搭配domain儲存[cloudfare](https://www.cloudflare.com/dns/)設定快取,減少圖片載入的速度 - (Cloudflare 教學) [https://sofree.cc/cloudflare-free-cdn/] - CDN:全名是「內容傳遞網路」(Content delivery network或Content distribution network),簡單說就是CDN伺服器會分散於全球各地,而這些伺服器會去抓取你網站的內容快取,而如果你人在美國,讀取了有掛CDN的網站,它就會就近讀取美國節點的網站,儘管網站在台灣,你也會感覺瀏覽速度不差。透過分散式的節點,可以分散網站的資源使用,如果你存取的美國節點失效,它會在就近找一個新的節點存取資料,讓資料不間斷。 ## Eloquent 資料庫層核心解構,讓 Laravel 支援更多資料庫 - config/database.php - builder - databaseserviceprovider - databasemanager - connectionfactory->connection->connector->pdo - build a building - blueprint - builder - grammar - worker - how to create own driver - pdo support? - datatype - grammar - start from unit test ## 水平擴展PHP應用程序 - 使用 Maghead 資料庫框架 - ORM - Maghead - maghead database framework - Laravel * Maghead - laravel container - service provider - boot() - register() - maghead - composer require maghead/laravel-bridge ## SPA前後端分離 [簡報](https://www.slideshare.net/ssuser630a24/laravel-conf-2017-final) 後端負責API部分;前端可自由選擇Js framework.... - 後端工程師:test case 能通過! - 前端工程師:撈出資料處理界面 (可搭配優美架構設計服用) ### 何謂 SPA Single Page Application單頁式應用程式,只在一個頁面中完成動作 |優點|缺點| | --- | --- | | 頁面能更快的被呈現 | SEO問題 | | 降低資料傳輸(ajax)| 舊型瀏覽器不支援| | UX大幅提升 || | APP、WEB不用重複開發 || ### 為何需要 SPA 1. 前端不需要了解後端的資料夾結構跟程式碼,並可以互相選擇適合自己的框架,只需要透過API、JSON文件來溝通 2. 清楚分工,例如:資料出問題找後端工程師,設定及畫面有問題找前端工程師 ### 重要 1. 開發API一定要做TDD開發 2. API認證及授權(JWT、Passport) ### JWT & Dingo (授權保護不要不合法的打進來) * JWT * Dingo (!!important) - 多重授權 - API版本 - https://github.com/dingo/api ### Vue - axios(ajax協定) - vuex(狀態管理模式-集中式儲存組建狀態) ### 前端整合踩雷 - 同源政策(Same-origin policy) 解決:cors - 頻率限制 - SEO 解決:Prerender service、Server side render(Nuxt.js) ### API設計文件 - apidocjs (產生技術文件) http://apidocjs.com/ - MyJson http://myjson.com/ - json-server ----- - [講者 github](https://github.com/Maras0830?tab=repositories) - [講者 blog](http://codingweb.tw/) - DEMO: - https://github.com/Maras0830/spa-example-with-laravel-vue-backend - https://github.com/Maras0830/spa-example-with-laravel-vue-frontend ## Laravel 事件及序列功能應用 [影片](https://www.youtube.com/watch?v=g1qBIcziPXQ&index=1&list=WL) [文件](https://laravel.com/docs/5.5/queues) 1.序列 queue - driver - database - amazon sqs - redis - ... - 優點 - 延時處理 - 運算分離 - nginx>php-fpm>php-cli - 降低耦合 - php artisan make:job PublicPost - 可靠性 ```php= dispatch((new Job)->onConnection('highCPU')); dispatch((new Job)->onQueue('high')); php artisan queue:word highCPU --queue=high ``` 2.event - php artisan event:generate - model 裡面可以直接設定在何種事件處理 3.shouldqueue https://divinglaravel.com/queue-system ## 實戰 TDD - 訂單系統 ### 開發流程 紅燈->綠燈->黃燈反覆循環 ### 簡介 Test、Driven、Development [TDD 真正的涵義](http://kojenchieh.pixnet.net/blog/post/75408721-tdd(test-driven-development)-%E7%9C%9F%E6%AD%A3%E7%9A%84%E6%B6%B5%E7%BE%A9) [30天快速上手TDD](https://dotblogs.com.tw/hatelove/2013/01/10/learning-tdd-in-30-days-day27-tdd-practice-part-1-until-first-atdd-red-light) - [講者github](https://github.com/y2468101216) - [講者blog](https://sls.weco.net/blog/10050) ## Laravel 的大流量策略(類似理論與概念) ### 面對大流量遇到問題不只是技術 - 升級AWS的設備(高費用) ### 新創公司如何遇到大流量 ### 如何以現有的資源大流量(1.5億個request) - 採用 CloudFlare 用檔案快取(全站快取) 優點:server費用僅 1200 元 缺點:不能用會員、即時更新文章內容 ### 轉換框架歷程 所有框架或是程式語言都有跟效能有關係 - WordPress:很難去自訂的編輯,有時更新會讓server掛掉 - Ruby on Rails:當初有三個人來幫忙,周遭學習資源很少,很難去第一時間解決問題 - Laravel:框架所擁有的社群很重要,還有自身的人脈 ### 硬體 Laravel、CloudFlare Business、AWS - Photon 的圖床 (交流趴後來有補充 後來他們換成用imgix) - CloudFlare CDN - 使用 CDN 省下很多靜態圖檔的花費時間 想法 1. 省下的錢足以在hire業務 2. 善用你的影響力幫公司前進 3. 自己的工作自己定義 4. 讓團隊因你存在而感到美好 ## 敏捷開發的最後一哩路 https://drive.google.com/file/d/0ByD9RXfQ70_6cUdueHcxMXFTOHc/view - 整合CI server - 寫測試與文件 - 寫健置與打包腳本 - 寫部屬與驗證繳本 - 打造接近線上環境的開發環境 ## 運用 Docker 整合 Laravel 提升團隊開發效率 [Docker 基礎介紹與實戰](https://blog.wu-boy.com/2016/04/introduction-to-docker/) ### [LaraDock](http://laradock.io/) - 適合初學者用來開發 - [教學影片](https://www.youtube.com/watch?v=OcZEbwxdg4Q&t=4s&list=PL3ZhWMazGi9JImZ4Xl1n1NDqZRQYaY2IE&index=1) [ElasticSearch](https://www.elastic.co/cn/):機器學習相關 - Docker 七大指令 - docker-compose -p $(project) up -d - docker-compose -p $(project) stop -d - docker-compose -p $(project) ps - docker-compose -p $(project) down - docker exec $(container) php artisan migrate - docker-compose -p $(project) build --no-cache $(container) - docker-compose exec $(container) /bin/bash ### 自動化部署 CI/CD [CI/CD](http://blog.91app.com/continuous-integration-delivery/) - 現今許多軟體公司皆以敏捷式或其變形之開發方法為圭臬,其優點為:在比較小且快速的循環中,持續驗證系統開發結果,小部分小部分地儘早確認,期望開發產出能符合原始需求,或依據產出進行快速修正。 - CI (Continuous Integration) - 持續性整合,目的為針對軟體系統每個變動,能持續且自動地進行驗證。此驗證可能包含了:建置 (build)、測試 (test)、程式碼分析 (source code analysis)、其他相關工作 - CD (Continuous Delivery & Continuous Deployment) - 持續性發布及部署,透過此流程可以確保軟體品質,不會因為一個錯誤變動而產生錯誤結果或崩潰(Crash)。此流程中的各類工具,也會產生一些回饋給開發者或其他角色,包含網頁/報表等等,用來追蹤並改善軟體潛藏的問題。 ##### 使用上... - 捨棄 Jenkins:設定太複雜 Gitlab:綁太死無法帶走 - 使用 *Drone 套件* Drone基於container使用 ##### 補充 https://www.ccc.tc/article/3 [講者GitHub](https://github.com/appleboy) [講者blog](https://blog.wu-boy.com/) ## Laravel優美架構 - 談可維護性與彈性設計 [簡報](https://docs.google.com/presentation/d/1rOWNct6tu8u63Gss8hHwz8KncWkP3yI3BR8dsDs1-Sg/edit#slide=id.g23a49237ff_0_0) [架構圖](https://i.imgur.com/Wg6bM2j.png) 一個專案很多人維護就要一個規範 - Repository:資料庫邏輯 關聯查詢 ```= $this->user->posts()->all(); ``` - Services:商業邏輯跟流程 將 controller 的條件判斷放在 Service 來與資料庫操作 - Presenter:外觀顯示 性別 0,1 回傳男生或女生 使用 accessor、mutators 會讓 Model 解法:Presenter ### 前後端分離 - 不同頁面只需要特定欄位 使用 Transformer - Formatter:制定格式 - Foundation :獨立掛載 ![](https://i.imgur.com/0zuMQys.png) ### 大大 [Laravel-Oh-Generators](https://github.com/Mombuyish/Laravel-Oh-Generators) ## KKBOX 的團隊協作方式 ### 多人協作 - 那些人? 多少人 - 怎麼互動?多少互動? - 做甚麼事?誰做多少事? ++個人的效率不等同於團隊的效率++ ### 目標 - Event Driven - 非同步/沒人喜歡被打斷 - 減少溝通成本 - 技術手冊、業務知識等 - 減少人力支出 - 盡量自動化 - 避免 single point of failure - 避免有人出狀況就會影響全局 ### 工具 - Issue Tracker:Trac - 其他:jira/redmine/bugzlilla - 把在做/想做/該做的事情都可以放上去 - 業務事項與決策的整合紀錄 - Github/Gitlab host 大部分的code - Gitlab CI - 自動化Unit test - 自動部屬 - 進主幹前 發MR 做Review - Git flow - Slack - trello ### 外部標準 - 取得最大公約數 - Coding Style (psr1,2/K&R) - 最多人用的Framework...... ### 工作流程 - trac 開票 - 工程師領票 - feature branch 改code - 開MR peer review/ci - acceptance/部屬 ### 好處 - 工程師可決定何時被打斷 - 容易掌握部門狀況 - slack git log trac 不用寫工作日誌 - 自動測試讓大家比較敢改code - 容易考古,決策過程不會被遺忘 ### 壞處 - event 能攜帶的payload 有限 - 單一大主題仍須開會面對面溝通 - 每個人必須積極主動 - 討人厭/不熟的工作會被冷落 - 資訊爆炸的隱憂 - 非工程師討厭非同步溝通 - 可設立單一窗口與非工程師溝通 - Legacy code 測試跟review 都很痛苦 ### QA - Code Review - 盡量都要 - 盡量分出一個小feature 功能 而不要大功能,大功能建議直接開一個develop branch - 新人訓練 ## 交流趴 設計模式 piepe: 裝飾者模式 Laravel Dusk ## 額外補充 Devops 一種重視「軟體開發人員(Dev)」和「IT運維技術人員(Ops)」之間溝通合作的文化、運動或慣例。透過自動化「軟體交付」和「架構變更」的流程,來使得構建、測試、發布軟體能夠更加地快捷、頻繁和可靠。 開發團隊與運營團隊之間更具協作性、更高效的關係」。由於團隊間協作關係的改善,整個組織的效率因此得到提升,伴隨頻繁變化而來的生產環境的風險也能得到降低。 http://www.ithome.com.tw/news/96861 https://zh.wikipedia.org/wiki/DevOps ###### tags: `laravelconf`