使用 laravel 的前與後

90
使用 Laravel 的前與後 shengyou @ 彰師大資工系學會(2014.11.27)

Transcript of 使用 laravel 的前與後

Page 1: 使用 laravel 的前與後

使用 Laravel 的前與後

shengyou @ 彰師大資工系學會(2014.11.27)

Page 2: 使用 laravel 的前與後

簡報主題• 透過使用 Laravel Framework 完成同樣的專題內容,比較使用框架與否的差異:

- 使用 Homestead

- 啟始 Laravel

- 環境變數設定- Artisan 指令- 建立 Migration/Seeding

- 設定 Route

- 連結 Controller

- 使用樣板引擎- 使用 ORM/Model

- 使用 Package

Page 3: 使用 laravel 的前與後

使用 Homestead

Page 4: 使用 laravel 的前與後

什麼是 Homestead?• 隨著開發工具愈趨複雜,為降低建置開發環境的難度、減少建置時間、並提供完整工具鏈,Laravel 官方推出名為 Homestead

的虛擬機器方案

• Homestead 2.0 更整合了 Composer,讓

homestead 的使用、操作更加簡便

★ 參考:http://laravel.tw/docs/4.2/homestead

Page 5: 使用 laravel 的前與後

為什麼要 Homestead?• 透過使用虛擬機器,可直接在開發機上模擬上線主機環境,確保程式可佈署

• 透過 Virtual Box + Vagrant 的組合,讓複雜的虛擬機器安裝、複製、散佈、更新變得更加容易,而 Laravel 官方透過這個方式直接提供開發者一整個開發工具包

Page 6: 使用 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

Page 7: 使用 laravel 的前與後

怎麼使用?• 安裝 Virtual Box

• 安裝 Vagrant

• 安裝 composer 套件

• 透過指令 啟動/暫停 homestead

★ 參考:http://mattstauffer.co/blog/introducing-laravel-homestead-2.0

Page 8: 使用 laravel 的前與後

簡要示範安裝 homestead

Page 9: 使用 laravel 的前與後

簡要示範啟始 homestead 設定

Page 10: 使用 laravel 的前與後

簡要示範設定 Homestead.yaml

Page 11: 使用 laravel 的前與後

簡要示範啟動 homestead VM

Page 12: 使用 laravel 的前與後

簡要示範暫停 homestead VM

Page 13: 使用 laravel 的前與後

Before & After• 團隊成員各出奇招、自建開發環境

• 佈署時可能因為環境差異而造成程式碼無法運作

• 統一團隊成員的開發環境的差異

• 開發環境與上線主機同步,開發時即可預測程式佈署結果

Page 14: 使用 laravel 的前與後

啟始 Laravel

Page 15: 使用 laravel 的前與後

如何啟始一個專案?• 使用 Laravel Installer

• 使用 Composer

★ 參考:http://laravel.tw/docs/4.2/installation

Page 16: 使用 laravel 的前與後

簡要示範使用 Laravel Installer

Page 17: 使用 laravel 的前與後

簡要示範使用 Composer - P.1

Page 18: 使用 laravel 的前與後

簡要示範使用 Composer - P.2

Page 19: 使用 laravel 的前與後

Laravel 目錄結構

• Document Root 指向 public

• vendor 是 Composer 套件• app 是大多數寫程式的位置

Page 20: 使用 laravel 的前與後

Before & After• 手動管理所有原始碼檔案,若在移動、複製時出錯就

GG

• 引入套件、升級函式庫費時辛苦

• 使用 Composer 統一管理所有元件,安裝、更新都方便

• 框架目錄結構清楚且依照慣例,即便新成員也能無接縫使用

Page 21: 使用 laravel 的前與後

環境變數設定

Page 22: 使用 laravel 的前與後

什麼是環境設定?• 在開發過程中,程式碼會經過數個不同的開發階段,每個開發階段都會佈署在不同的機器上。也因此,諸如 DB 連線資訊等變數在不同機器上就會有不同的設定

• 環境變數的設計,就是讓程式碼可以動態的適應不同機器上的不同設定,減少佈署時需手動調整設定的負擔

Page 23: 使用 laravel 的前與後

各開發階段流程

[ development ]開發用、測試用

[ local ]本機端開發

[ staging ]階段性發佈

[ production ]正式上線

每個開發夥伴本機端獨立開發,開發完成後送回版本控制系統

[version control]原始碼管理

定期從版本控制系統取出後,進行整合、單元等測試

專案階段完成後,進行階段性發佈,給客戶測試、確認

所有階段完成後佈署至正式主機,對外公開使用

Page 24: 使用 laravel 的前與後

為什麼要設定環境?• 以往程式碼佈署到不同主機時,就要手動修改相關的連線資訊

• Laravel 的環境設定設計,可以讓 Laravel

自動依照不同的主機名稱,自動載入對應的相關設定,開發者也可自行決定開發階段的名稱,可搭配自動佈署工具,讓佈署工作快速不出錯

Page 25: 使用 laravel 的前與後

Laravel 如何偵測環境?• bootstrap/start.php

• ~$ hostname

★ 參考:http://laravel.com/docs/configuration#environment-configuration

Laravel 自動環境偵測

Page 26: 使用 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

Page 27: 使用 laravel 的前與後

簡要示範設定 debug mode

Page 28: 使用 laravel 的前與後

簡要示範設定 mysql connections

Page 29: 使用 laravel 的前與後

Before & After• 程式碼佈署到不同主機時,都要手動修改相關設定值

• 直接將機敏資訊寫在程式碼放到版本控制裡,有曝露風險

• 透過環境設定,程式碼可以自動適應所在主機的相關設定

• 透過 phpenv 動態載入,機敏資訊不會曝露在版本控制的原始碼內

Page 30: 使用 laravel 的前與後

Artisan 指令

Page 31: 使用 laravel 的前與後

什麼是 artisan?• Laravel 專屬的指令列工具,協助我們完成日常繁瑣工作事務,如:

- 產生 auto-load、清快取、最佳化

- 產生 migration、控制 queue

- 維護模式

Page 32: 使用 laravel 的前與後

為什麼要用 artisan?• 自動幫忙產生想要的 物件 鷹架, 可以少打一些程式碼

• 啟動常用的工具、最佳化 Laravel

• 簡單來說,就是因為 懶 我們是高效率的攻城獅

Page 33: 使用 laravel 的前與後

如何使用 artisan?• $ php artisan {command}

• 常用的指令有:

- env、 dump-autoload、optimize

- controller:make、migrate:make

- migrate、db:seed

Page 34: 使用 laravel 的前與後

簡要示範artisan 常用指令示範

Page 35: 使用 laravel 的前與後

Before & After• 所有程式碼維護的工作都要由自己手動處理

• 所有關於框架的鎖事都可以由指令列協助我們完成

Page 36: 使用 laravel 的前與後

建立 Migration/Seeding

Page 37: 使用 laravel 的前與後

什麼是 Migration?• 所有對 DB 操作的動作,都撰寫對應的程式碼來完成 (Laravel Schema builder)

• 分成 up / down (前進/後退)

• 每個人拿到更新版本後,透過執行

migrate 就可以有相同的 DB 結構,若有問題也可以 rollback 回之前的狀態

★ 參考:http://laravel.tw/docs/migrations

Page 38: 使用 laravel 的前與後

什麼是 Seeding?• 在開發時,往往會需要資料來做顯示、刪除來測試程式,但資料的內容不必是真的,但自己建太累了…

• 透過 Laravel 的 table seeder,可以快速的將假資料倒進資料庫,方便開發 CRUD 這種以資料操作為主的功能

★ 參考:http://laravel.tw/docs/migrations#database-seeding

Page 39: 使用 laravel 的前與後

為什麼要用 M & S?• 多人開發時,因為新功能而需要修改 DB

結構,若沒有 Migration 則其他人就無法知道 DB 的差異;佈署時,DB 的修改沒有紀錄、若有狀況也無從回復

• 用 Seeding 後,可以快速的讓 DB 內有測試資料可以使用,寫 DB 操作時效率大增

Page 40: 使用 laravel 的前與後

怎麼做 Migration?使用 artisan 產生 migrate 檔

Page 41: 使用 laravel 的前與後

怎麼做 Migration?透過 Laravel Shema Builder 操作 DB 變更

Page 42: 使用 laravel 的前與後

怎麼做 Migration?透過 artisan 執行 migrate

Page 43: 使用 laravel 的前與後

怎麼做 Migration?透過 artisan 執行 migrate

Page 44: 使用 laravel 的前與後

怎麼做 Seeding?先寫 Seed Class (產生完 Class 記得 dump-autoload)

Page 45: 使用 laravel 的前與後

怎麼做 Seeding?在 DatabaseSeeder 內呼叫要執行的 Seed Class

Page 46: 使用 laravel 的前與後

怎麼做 Seeding?使用 artisan 執行 db:seed

Page 47: 使用 laravel 的前與後

Before & After• 所有的 DB 操作沒有紀錄,多人開發時常常會因為 DB

不同步炸掉

• 開發時,光產生測試資料就花掉很多時間

• 所有 DB 修改都有紀錄,同步方便且可復原

• 可快速產生假資料,也可快速清空資料庫,方便開發寫資料操作 (CRUD)功能

Page 48: 使用 laravel 的前與後

設定 Route

Page 49: 使用 laravel 的前與後

什麼是 Route?• Route 就是 App 一條一條的門禁規則,規則內指定每一個路由可以接受的動作

(GET、POST) 及需要傳入的參數

• 從上而下逐一比對。符合就會執行、若找不到就會回傳 404 (Not Found)

• 可搭配 group、prefix、namespace、sub-

domain 做彈性設計★ 參考:http://laravel.tw/docs/routing

Page 50: 使用 laravel 的前與後

為什麼要用 Route?• Document Root 指定在 public,透過框架進入點 (index.php) 統一管理所有路由,增加程式碼安全性

• 透過 Route 設計,所有 App 可使用的路由就一目了然,若出錯時也方便除錯

Page 51: 使用 laravel 的前與後

怎麼設定 Route?app/routes.php

Page 52: 使用 laravel 的前與後

檢查 Route 設定用 artisan 指令列出目前的 Route 設定

Page 53: 使用 laravel 的前與後

Before & After• 所有的頁面都要手動新增一個 *.php

檔案

• 每一個 *.php 檔案還要針對可接受的

http method 做判斷

• 統一由 Route 管理

App 內所有的路由,增加開發的效率與應用程式安全性

Page 54: 使用 laravel 的前與後

連結 Controller

Page 55: 使用 laravel 的前與後

什麼是 Controller?• 依照 MVC 原理,處理 Route 送過來的資料,並依應用程式邏輯操作 Model 改變儲存的資料

• 所有應用程式的邏輯由 Controller 統一處理,Controller 本身依功能命名

★ 參考:http://laravel.tw/docs/controllers

Page 56: 使用 laravel 的前與後

為什麼用 Controller?• 將應用程式的裡將複雜的程式操作邏輯,獨立成 Class 以利維護,從 Class、Function 的命名就可以大致猜出其功能

• Laravel Controller 本身即 IoC Container,可自動 dependency injection

Page 57: 使用 laravel 的前與後

怎麼產生 Controller?使用 artisan 指令產生 Controller Class

Page 58: 使用 laravel 的前與後

把 Route 導入app/routes.php

Page 59: 使用 laravel 的前與後

Controller 怎麼寫?對應 function 名稱內寫操作邏輯

Page 60: 使用 laravel 的前與後

Before & After• 程式的操作邏輯總是寫在 *.php 的開頭,程式邏輯、DB

操作、資料顯示全混在一起的「義大利麵式」寫法

• 程式操作邏輯分門別類由不同的 Class 處理,Class 內各

Function 也只專注處理一個邏輯,在分工與維護上都更清楚

Page 61: 使用 laravel 的前與後

使用樣板引擎

Page 62: 使用 laravel 的前與後

什麼是/為什麼要樣板?• 一個 MVC 網路應用程式直接跟使用者互動的部份就是 View

• 在實作頁面時,很多頁面的 HTML DOM

其實是重複的,為減少維護多份重複的原始碼,並讓開發更簡便,我們需要透過樣板將頁面相同的區塊獨立出來

Page 63: 使用 laravel 的前與後

Laravel 的樣板引擎• Laravel 針對寫網路應用程式一定需要的樣板功能提供了 Blade 這個樣板引擎

• 透過 Blade 語法,可以讓頁面有親屬關係,讓樣板繼承 (template inheritance)變得簡單,且可將頁面重複的部份拆分成區塊

(section),再引入至頁面對應的位置即可

★ 參考:http://laravel.tw/docs/4.2/templates

Page 64: 使用 laravel 的前與後

怎麼用 Blade?• 所有的 view 都統一放在 views 資料夾底下

• 依照慣例,主樣板會放在 layouts 資料夾內;子樣板會放在該 resource 資料夾內

• blade 樣板的副檔名命名為 *.blade.php

Page 65: 使用 laravel 的前與後

設定主樣板先定義一個主樣板的 HTML 頁面框架

Page 66: 使用 laravel 的前與後

設定主樣板先定義一個主樣板的 HTML 頁面框架

Page 67: 使用 laravel 的前與後

設定主樣板先定義一個主樣板的 HTML 頁面框架

Page 68: 使用 laravel 的前與後

子樣板繼承主樣板子樣板繼承主樣板

Page 69: 使用 laravel 的前與後

Controller 回傳 View在 Controller 裡宣告回傳 view 的名稱

Page 70: 使用 laravel 的前與後

Before & After• 不同頁面裡相同的區塊僅能用 include

的方式在不同頁面引入、彈性較低

• 透過 Blade 很容易的將網頁拆成主板、子板及區塊

• 不同區塊經拆解後,容易重複使用,開發時僅需專注在區塊內即可

Page 71: 使用 laravel 的前與後

使用 ORM / Model

Page 72: 使用 laravel 的前與後

什麼是 ORM?• ORM = Object-relational mapping

• 簡單來說,就是把資料庫裡一筆一筆的資料變成物件來操作。這些物件透過繼承可以增加更多的方法,讓資料庫的操作

(CRUD) 更加直覺、方便

Page 73: 使用 laravel 的前與後

為什麼要用 ORM?• 原本在寫資料庫查詢時,往往需要自行依照需求下 SQL 查詢式,當查詢式變長、關聯日趨複雜時,很難直覺了解該查詢式的作用

• 自行處理 SQL 查詢式時,也需確認輸入的字串是否都有 Escape 以防安全性疑慮

Page 74: 使用 laravel 的前與後

Laravel 的 Eloquent• Eloquent 是 Laravel 提供的 ORM 工具,依照以下慣例,讓 DB 操作變得容易:

- 一個 resource 對應到 DB 裡的一個 table

- 一個 model 對應到 table 裡的一個 row

- model 是單數、table 是複數- 從 Eloquent 取出來的東西是 Collection

Page 75: 使用 laravel 的前與後

怎麼設定 Model?在 Model 裡設定 DB 名稱 (可依照慣例)

Page 76: 使用 laravel 的前與後

怎麼設定關聯?設定關聯 function

Page 77: 使用 laravel 的前與後

怎麼操作 ORM?取出前 5 筆文章 (Laravel 支援自動分頁喔!)

Page 78: 使用 laravel 的前與後

在 View 裡呈現在 view 裡將 model 的資料印出來

Page 79: 使用 laravel 的前與後

Before & After• 所有跟資料庫操作相關的動作都要自己下 SQL 語法

• 在組合 SQL 語法時,要小心任何有安全性疑慮的字串

• 透過 Eloquent,操作 DB 就像寫敘述句一樣,資料表間的關聯也很直覺

• 本身就已針對安全性做防禦,減少初學者可能的錯誤

Page 80: 使用 laravel 的前與後

使用 Package

Page 81: 使用 laravel 的前與後

什麼是 Package?• Package 簡單來說就是 Laravel 的擴充程式,透過安裝 Package 就可以直接使用別人寫好的功能,加快開發速度

• 在 3.0 時叫 Bundle,4.0 以後改稱 Package

• 概念同 Symfony 的 Bundle;Rails 的 Gems

Page 82: 使用 laravel 的前與後

何處尋找 Package?• 搜尋引擎:

- Packagist

- Packalyst

• 聽 大神/同事/朋友 的推薦

• 看別人的 Open Source 裡用哪些?

Page 83: 使用 laravel 的前與後

如何選擇 Package?• 參考 Package 搜尋引擎上的 Downloads、

Trust、Popularity 等數值做參考指標

• 看 Package 的作者是誰?

• 聽別人的推薦、部落格的介紹

• 多試幾個同類型的 Package,找出最順自己手的來用

Page 84: 使用 laravel 的前與後

如何安裝 Package?• 仔細閱讀 README (確認版本、規格)

• 調整 composer.json / composer update

• 設定 ServiceProvider、Alias (視需求)

• Publish 設定 (視需求)

• Migrate DB (視需求)

★ 以 Sentry 2 為例:https://cartalyst.com/manual/sentry#installation

Page 85: 使用 laravel 的前與後

設定 composer.json設定 composer.json 內的 package 名稱

Page 86: 使用 laravel 的前與後

更新套件使用 composer update 指令

Page 87: 使用 laravel 的前與後

設定 Service Provider依套件指示設定 Service Provider

Page 88: 使用 laravel 的前與後

Before & After• 想要使用別人寫好的函式庫,要手動下載、安裝、整合進自己的程式碼

• 透過 Laravel Package

的設定,別人已經寫好的函式庫可以迅度的整合到自己的專案裡,站在巨人的肩膀上

Page 89: 使用 laravel 的前與後

小結• 透過把相同專案用 Laravel 再實作一次做為前、後比較,讓我們了解使用框架後在開發上帶來的好處與便利性

• 希望這樣能說服你嘗試 Laravel!

Page 90: 使用 laravel 的前與後

Q & AThanks for listening!