# 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 :獨立掛載

### 大大
[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`