使用 laravel 的前與後
-
Upload
shengyou-fan -
Category
Technology
-
view
667 -
download
5
Transcript of 使用 laravel 的前與後
使用 Laravel 的前與後
shengyou @ 彰師大資工系學會(2014.11.27)
簡報主題• 透過使用 Laravel Framework 完成同樣的專題內容,比較使用框架與否的差異:
- 使用 Homestead
- 啟始 Laravel
- 環境變數設定- Artisan 指令- 建立 Migration/Seeding
- 設定 Route
- 連結 Controller
- 使用樣板引擎- 使用 ORM/Model
- 使用 Package
使用 Homestead
什麼是 Homestead?• 隨著開發工具愈趨複雜,為降低建置開發環境的難度、減少建置時間、並提供完整工具鏈,Laravel 官方推出名為 Homestead
的虛擬機器方案
• Homestead 2.0 更整合了 Composer,讓
homestead 的使用、操作更加簡便
★ 參考:http://laravel.tw/docs/4.2/homestead
為什麼要 Homestead?• 透過使用虛擬機器,可直接在開發機上模擬上線主機環境,確保程式可佈署
• 透過 Virtual Box + Vagrant 的組合,讓複雜的虛擬機器安裝、複製、散佈、更新變得更加容易,而 Laravel 官方透過這個方式直接提供開發者一整個開發工具包
有哪些好料?• Ubuntu 14.04
• PHP 5.6 (with mcrypt)
• HHVM
• Nginx
• MySQL
• Postgres
• Node (With Bower, Grunt, and Gulp)
• Redis
• Memcached
• Beanstalkd
• Laravel Envoy
• HipChat + Slack
怎麼使用?• 安裝 Virtual Box
• 安裝 Vagrant
• 安裝 composer 套件
• 透過指令 啟動/暫停 homestead
★ 參考:http://mattstauffer.co/blog/introducing-laravel-homestead-2.0
簡要示範安裝 homestead
簡要示範啟始 homestead 設定
簡要示範設定 Homestead.yaml
簡要示範啟動 homestead VM
簡要示範暫停 homestead VM
Before & After• 團隊成員各出奇招、自建開發環境
• 佈署時可能因為環境差異而造成程式碼無法運作
• 統一團隊成員的開發環境的差異
• 開發環境與上線主機同步,開發時即可預測程式佈署結果
啟始 Laravel
如何啟始一個專案?• 使用 Laravel Installer
• 使用 Composer
★ 參考:http://laravel.tw/docs/4.2/installation
簡要示範使用 Laravel Installer
簡要示範使用 Composer - P.1
簡要示範使用 Composer - P.2
Laravel 目錄結構
• Document Root 指向 public
• vendor 是 Composer 套件• app 是大多數寫程式的位置
Before & After• 手動管理所有原始碼檔案,若在移動、複製時出錯就
GG
• 引入套件、升級函式庫費時辛苦
• 使用 Composer 統一管理所有元件,安裝、更新都方便
• 框架目錄結構清楚且依照慣例,即便新成員也能無接縫使用
環境變數設定
什麼是環境設定?• 在開發過程中,程式碼會經過數個不同的開發階段,每個開發階段都會佈署在不同的機器上。也因此,諸如 DB 連線資訊等變數在不同機器上就會有不同的設定
• 環境變數的設計,就是讓程式碼可以動態的適應不同機器上的不同設定,減少佈署時需手動調整設定的負擔
各開發階段流程
[ development ]開發用、測試用
[ local ]本機端開發
[ staging ]階段性發佈
[ production ]正式上線
每個開發夥伴本機端獨立開發,開發完成後送回版本控制系統
[version control]原始碼管理
定期從版本控制系統取出後,進行整合、單元等測試
專案階段完成後,進行階段性發佈,給客戶測試、確認
所有階段完成後佈署至正式主機,對外公開使用
為什麼要設定環境?• 以往程式碼佈署到不同主機時,就要手動修改相關的連線資訊
• Laravel 的環境設定設計,可以讓 Laravel
自動依照不同的主機名稱,自動載入對應的相關設定,開發者也可自行決定開發階段的名稱,可搭配自動佈署工具,讓佈署工作快速不出錯
Laravel 如何偵測環境?• bootstrap/start.php
• ~$ hostname
★ 參考:http://laravel.com/docs/configuration#environment-configuration
Laravel 自動環境偵測
如何設定環境變數?• app/config/{environment}/*.php
- Laravel 會自動根據目前的環境,載入對應的設定檔,覆寫預設設定
• .env.{environment}.php
- Laravel 4.1 開始整合 phpenv 套件,直接將環境變數載入後,覆寫預設設定
★ 參考:http://laravel.tw/docs/configuration#protecting-sensitive-configuration
★ 參考:http://laravel.tw/docs/4.2/configuration#environment-configuration
簡要示範設定 debug mode
簡要示範設定 mysql connections
Before & After• 程式碼佈署到不同主機時,都要手動修改相關設定值
• 直接將機敏資訊寫在程式碼放到版本控制裡,有曝露風險
• 透過環境設定,程式碼可以自動適應所在主機的相關設定
• 透過 phpenv 動態載入,機敏資訊不會曝露在版本控制的原始碼內
Artisan 指令
什麼是 artisan?• Laravel 專屬的指令列工具,協助我們完成日常繁瑣工作事務,如:
- 產生 auto-load、清快取、最佳化
- 產生 migration、控制 queue
- 維護模式
為什麼要用 artisan?• 自動幫忙產生想要的 物件 鷹架, 可以少打一些程式碼
• 啟動常用的工具、最佳化 Laravel
• 簡單來說,就是因為 懶 我們是高效率的攻城獅
如何使用 artisan?• $ php artisan {command}
• 常用的指令有:
- env、 dump-autoload、optimize
- controller:make、migrate:make
- migrate、db:seed
簡要示範artisan 常用指令示範
Before & After• 所有程式碼維護的工作都要由自己手動處理
• 所有關於框架的鎖事都可以由指令列協助我們完成
建立 Migration/Seeding
什麼是 Migration?• 所有對 DB 操作的動作,都撰寫對應的程式碼來完成 (Laravel Schema builder)
• 分成 up / down (前進/後退)
• 每個人拿到更新版本後,透過執行
migrate 就可以有相同的 DB 結構,若有問題也可以 rollback 回之前的狀態
★ 參考:http://laravel.tw/docs/migrations
什麼是 Seeding?• 在開發時,往往會需要資料來做顯示、刪除來測試程式,但資料的內容不必是真的,但自己建太累了…
• 透過 Laravel 的 table seeder,可以快速的將假資料倒進資料庫,方便開發 CRUD 這種以資料操作為主的功能
★ 參考:http://laravel.tw/docs/migrations#database-seeding
為什麼要用 M & S?• 多人開發時,因為新功能而需要修改 DB
結構,若沒有 Migration 則其他人就無法知道 DB 的差異;佈署時,DB 的修改沒有紀錄、若有狀況也無從回復
• 用 Seeding 後,可以快速的讓 DB 內有測試資料可以使用,寫 DB 操作時效率大增
怎麼做 Migration?使用 artisan 產生 migrate 檔
怎麼做 Migration?透過 Laravel Shema Builder 操作 DB 變更
怎麼做 Migration?透過 artisan 執行 migrate
怎麼做 Migration?透過 artisan 執行 migrate
怎麼做 Seeding?先寫 Seed Class (產生完 Class 記得 dump-autoload)
怎麼做 Seeding?在 DatabaseSeeder 內呼叫要執行的 Seed Class
怎麼做 Seeding?使用 artisan 執行 db:seed
Before & After• 所有的 DB 操作沒有紀錄,多人開發時常常會因為 DB
不同步炸掉
• 開發時,光產生測試資料就花掉很多時間
• 所有 DB 修改都有紀錄,同步方便且可復原
• 可快速產生假資料,也可快速清空資料庫,方便開發寫資料操作 (CRUD)功能
設定 Route
什麼是 Route?• Route 就是 App 一條一條的門禁規則,規則內指定每一個路由可以接受的動作
(GET、POST) 及需要傳入的參數
• 從上而下逐一比對。符合就會執行、若找不到就會回傳 404 (Not Found)
• 可搭配 group、prefix、namespace、sub-
domain 做彈性設計★ 參考:http://laravel.tw/docs/routing
為什麼要用 Route?• Document Root 指定在 public,透過框架進入點 (index.php) 統一管理所有路由,增加程式碼安全性
• 透過 Route 設計,所有 App 可使用的路由就一目了然,若出錯時也方便除錯
怎麼設定 Route?app/routes.php
檢查 Route 設定用 artisan 指令列出目前的 Route 設定
Before & After• 所有的頁面都要手動新增一個 *.php
檔案
• 每一個 *.php 檔案還要針對可接受的
http method 做判斷
• 統一由 Route 管理
App 內所有的路由,增加開發的效率與應用程式安全性
連結 Controller
什麼是 Controller?• 依照 MVC 原理,處理 Route 送過來的資料,並依應用程式邏輯操作 Model 改變儲存的資料
• 所有應用程式的邏輯由 Controller 統一處理,Controller 本身依功能命名
★ 參考:http://laravel.tw/docs/controllers
為什麼用 Controller?• 將應用程式的裡將複雜的程式操作邏輯,獨立成 Class 以利維護,從 Class、Function 的命名就可以大致猜出其功能
• Laravel Controller 本身即 IoC Container,可自動 dependency injection
怎麼產生 Controller?使用 artisan 指令產生 Controller Class
把 Route 導入app/routes.php
Controller 怎麼寫?對應 function 名稱內寫操作邏輯
Before & After• 程式的操作邏輯總是寫在 *.php 的開頭,程式邏輯、DB
操作、資料顯示全混在一起的「義大利麵式」寫法
• 程式操作邏輯分門別類由不同的 Class 處理,Class 內各
Function 也只專注處理一個邏輯,在分工與維護上都更清楚
使用樣板引擎
什麼是/為什麼要樣板?• 一個 MVC 網路應用程式直接跟使用者互動的部份就是 View
• 在實作頁面時,很多頁面的 HTML DOM
其實是重複的,為減少維護多份重複的原始碼,並讓開發更簡便,我們需要透過樣板將頁面相同的區塊獨立出來
Laravel 的樣板引擎• Laravel 針對寫網路應用程式一定需要的樣板功能提供了 Blade 這個樣板引擎
• 透過 Blade 語法,可以讓頁面有親屬關係,讓樣板繼承 (template inheritance)變得簡單,且可將頁面重複的部份拆分成區塊
(section),再引入至頁面對應的位置即可
★ 參考:http://laravel.tw/docs/4.2/templates
怎麼用 Blade?• 所有的 view 都統一放在 views 資料夾底下
• 依照慣例,主樣板會放在 layouts 資料夾內;子樣板會放在該 resource 資料夾內
• blade 樣板的副檔名命名為 *.blade.php
設定主樣板先定義一個主樣板的 HTML 頁面框架
設定主樣板先定義一個主樣板的 HTML 頁面框架
設定主樣板先定義一個主樣板的 HTML 頁面框架
子樣板繼承主樣板子樣板繼承主樣板
Controller 回傳 View在 Controller 裡宣告回傳 view 的名稱
Before & After• 不同頁面裡相同的區塊僅能用 include
的方式在不同頁面引入、彈性較低
• 透過 Blade 很容易的將網頁拆成主板、子板及區塊
• 不同區塊經拆解後,容易重複使用,開發時僅需專注在區塊內即可
使用 ORM / Model
什麼是 ORM?• ORM = Object-relational mapping
• 簡單來說,就是把資料庫裡一筆一筆的資料變成物件來操作。這些物件透過繼承可以增加更多的方法,讓資料庫的操作
(CRUD) 更加直覺、方便
為什麼要用 ORM?• 原本在寫資料庫查詢時,往往需要自行依照需求下 SQL 查詢式,當查詢式變長、關聯日趨複雜時,很難直覺了解該查詢式的作用
• 自行處理 SQL 查詢式時,也需確認輸入的字串是否都有 Escape 以防安全性疑慮
Laravel 的 Eloquent• Eloquent 是 Laravel 提供的 ORM 工具,依照以下慣例,讓 DB 操作變得容易:
- 一個 resource 對應到 DB 裡的一個 table
- 一個 model 對應到 table 裡的一個 row
- model 是單數、table 是複數- 從 Eloquent 取出來的東西是 Collection
怎麼設定 Model?在 Model 裡設定 DB 名稱 (可依照慣例)
怎麼設定關聯?設定關聯 function
怎麼操作 ORM?取出前 5 筆文章 (Laravel 支援自動分頁喔!)
在 View 裡呈現在 view 裡將 model 的資料印出來
Before & After• 所有跟資料庫操作相關的動作都要自己下 SQL 語法
• 在組合 SQL 語法時,要小心任何有安全性疑慮的字串
• 透過 Eloquent,操作 DB 就像寫敘述句一樣,資料表間的關聯也很直覺
• 本身就已針對安全性做防禦,減少初學者可能的錯誤
使用 Package
什麼是 Package?• Package 簡單來說就是 Laravel 的擴充程式,透過安裝 Package 就可以直接使用別人寫好的功能,加快開發速度
• 在 3.0 時叫 Bundle,4.0 以後改稱 Package
• 概念同 Symfony 的 Bundle;Rails 的 Gems
何處尋找 Package?• 搜尋引擎:
- Packagist
- Packalyst
• 聽 大神/同事/朋友 的推薦
• 看別人的 Open Source 裡用哪些?
如何選擇 Package?• 參考 Package 搜尋引擎上的 Downloads、
Trust、Popularity 等數值做參考指標
• 看 Package 的作者是誰?
• 聽別人的推薦、部落格的介紹
• 多試幾個同類型的 Package,找出最順自己手的來用
如何安裝 Package?• 仔細閱讀 README (確認版本、規格)
• 調整 composer.json / composer update
• 設定 ServiceProvider、Alias (視需求)
• Publish 設定 (視需求)
• Migrate DB (視需求)
★ 以 Sentry 2 為例:https://cartalyst.com/manual/sentry#installation
設定 composer.json設定 composer.json 內的 package 名稱
更新套件使用 composer update 指令
設定 Service Provider依套件指示設定 Service Provider
Before & After• 想要使用別人寫好的函式庫,要手動下載、安裝、整合進自己的程式碼
• 透過 Laravel Package
的設定,別人已經寫好的函式庫可以迅度的整合到自己的專案裡,站在巨人的肩膀上
小結• 透過把相同專案用 Laravel 再實作一次做為前、後比較,讓我們了解使用框架後在開發上帶來的好處與便利性
• 希望這樣能說服你嘗試 Laravel!
Q & AThanks for listening!