啟動 Laravel 與環境設定
范聖佑 Shengyou Fan
新北市樹林國⼩小 (2015/07/07)
適
⽤用
5.1
版
單元主題
• 學習如何建⽴立全新的 Laravel 5.1 專案
- 使⽤用 Composer
- 使⽤用 laravel-installer
• 了解 Laravel 的專案資料夾結構
• 了解 Laravel 的環境變數設定⽅方式
• 建⽴立第⼀一個 git 版本儲存庫
建⽴立	
  Laravel	
  5.1	
  專案
Modern PHP 的開發架構
瀏覽網⾴頁
使⽤用者端 HTTP
伺服器 index.php
public/ 網站根⺫⽬目錄
應⽤用程式進⼊入點
vendor/
元件 A
元件 B
由 Composer 統⼀一
管理第三⽅方元件
config/
共⽤用設定檔
應⽤用程式類別
app/
⾃自⾏行依需求規劃應
⽤用程式⺫⽬目錄架構
PSR-4 類別對應點
新架構解決的問題
• 以往網址會曝露出程式語⾔言副檔名,除了網址較不
好看外,也容易讓駭客知道伺服器端使⽤用的技術,
較容易針對該語⾔言弱點進⾏行攻擊
• ⼀一改以往網址是由瀏覽的路徑由檔名決定,新架構
透過 Route 可以讓網址更符合語意及 RESTful
• 以往所有的程式碼都放在 Document Root 底下,若
HTTP 伺服器沒有設定好或被破解,有可能讓所有源
始碼及系統設定等機敏資訊曝露出來
• 新架構的 Document Root 底下只有⼀一個 index.php 做
為程式進⼊入點,其餘程式都放置在網路伺服器⾮非公
開之處,可增加程式安全性
Modern PHP 框架的 Skeleton
• 由於 PHP-FIG 組織的成⽴立、Composer 的興起,各
Modern PHP 框架在新版都將框架內的各功能組件獨
⽴立成 PHP 元件。因此,就算不是使⽤用該框架的開發
者,也能使⽤用該框架的元件另作他途
• ⽽而各框架為了讓其開發者有⼀一個「啟始包」,可以迅
速的架起⼀一個網路應⽤用程式雛型。因此,各框架也將
⾃自⾝身框架的 Skeleton 包裝成⼀一個 Composer 元件
• 在 Laravel 的世界裡,laravel/laravel 這個
Composer 元件就是 Laravel 框架的 Skeleton。我們可
以透過 composer	
  create-­‐project 來啟動⼀一個
Laravel 專案
在 Packagist 上查詢元件資訊
作者資訊
版本資訊
套件資訊
相依資訊
$	
  composer	
  create-­‐project	
  laravel/laravel	
  -­‐-­‐prefer-­‐dist
(⽤用 Composer 建⽴立 Laravel 專案 skeleton)
★ 官⽅方⽂文件:http://laravel.com/docs/5.1#installation
composer	
  create-­‐project
• 使⽤用 Composer 建⽴立 Laravel Skeleton
- Composer 可以透過 create-project 指令將某個元件做為
建⽴立專案啟始包的⼀一種⽅方式
- ⺫⽬目前各主流框架都是透過這種⽅方式來建⽴立 Skeleton,⽽而
⾮非傳統下載 zip 檔
• 範例:
$	
  composer	
  create-­‐project	
  vendor/package	
  {target-­‐directory}	
  
[version]	
  -­‐-­‐prefer-­‐dist
參數說明:	
  	
  
vendor:元件開發者名稱	
  
package:元件名稱	
  
target-­‐directory:預定建⽴立的資料夾名稱	
  
version:預定使⽤用的版本	
  
-­‐-­‐prefer-­‐dist:使⽤用	
  zip	
  散佈檔⽽而不要	
  clone	
  整個源始碼
採⽤用 laravel-­‐installer 安裝
• Composer 在取得套件相依資訊及下載元件時的速度
會受到機器運算能⼒力及網路下載速度影響其運⾏行速
度
• 為了加快產⽣生專案啟始包的速度,Laravel 官⽅方釋出
laravel-­‐installer 指令列⼯工具,讓我們可以迅速
的完成 composer	
  create-­‐project 所執⾏行的動作
• 在使⽤用之前,需要先安裝 Composer Global Package
才能取⽤用 laravel-­‐installer 指令 (請參考前⼀一章的教學
內容)
$	
  laravel	
  new	
  [project-­‐name]
(速度++)
★ 官⽅方⽂文件:http://laravel.com/docs/5.1#installation
⽤用 laravel-installer 建⽴立 laravel 專案 skeleton
移除不必要檔案
• 專案內的說明檔可以移除,包括:
- readme.md
驗證安裝成功
• 開啟 UwAmp,確認 Document Root 指向 Laravel 專
案的 public,並啟動 Server
• 打開瀏覽器:http://localhost:8000
確認
安裝成功
安裝疑難排解
遇到 Github 流量上限
• Composer 在下載套件時,由於⼤大量依賴 Github 做
為下載來源。若⾃自⼰己在練習時重覆啟動數個 Laravel
專案多次;或是如⼯工作坊在電腦教室練習時,對外
IP 都是相同的狀況下,很容易因為⼤大量相同來源的
下載要求⽽而⽤用盡 Github 的下載流量上限
• 這時需要⽤用⾃自⼰己的 Github 帳號登⼊入 Github,並到帳
號設定內啟動⼀一組 token 供 Composer 使⽤用,設定成
功後就可以讓 Composer 繼續下載 (請事先申請 Github 帳號)
Composer 已達下載上限
⾄至 Github 帳號設定
產⽣生新的 token
設定 token 名稱及權限
將 token 設定給 Composer
⼀一時之間網路出問題
• 若是因為網路暫時出問題,⽽而無法透過 Composer
或 laravel-installer 從遠端取得 Laravel Skelton 的話,
可以先暫時使⽤用 wagon 內建的 Laravel 打包版做為替
代⽅方案:
- 先將 laravel5.1.2.zip 檔案解壓縮
- 將資料夾移⾄至 uwampwww 底下
- 使⽤用 composer	
  run-­‐script 指令執⾏行未完成的啟
始動作
Laravel 專案啟動時的動作
• 使⽤用 Composer 啟動 Laravel Skelton 時,預設會進⾏行
以下幾個動作:
1. 將 .env.example 檔案複製⼀一份成 .env
2. 最佳化 Class ⾃自動載⼊入
3. 產⽣生應⽤用程式⾦金鑰
scripts 區段設定
"scripts":	
  {	
  
	
   "post-­‐install-­‐cmd":	
  [	
  
	
   	
   "php	
  artisan	
  clear-­‐compiled",	
  
	
   	
   "php	
  artisan	
  optimize"	
  
	
   ],	
  
	
   "pre-­‐update-­‐cmd":	
  [	
  
	
   	
   "php	
  artisan	
  clear-­‐compiled"	
  
	
   ],	
  
	
   "post-­‐update-­‐cmd":	
  [	
  
	
   	
   "php	
  artisan	
  optimize"	
  
	
   ],	
  
	
   "post-­‐root-­‐package-­‐install":	
  [	
  
	
   	
   "php	
  -­‐r	
  "copy('.env.example',	
  '.env');""	
  
	
   ],	
  
	
   "post-­‐create-­‐project-­‐cmd":	
  [	
  
	
   	
   "php	
  artisan	
  key:generate"	
  
	
   ]	
  
},
laravel-installer 的動作
composer	
  run-­‐script
• Composer 可以透過 run-­‐script 來執⾏行
composer.json 內設定好的 scripts 動作
• 若是因為某些原因⽽而需要再次執⾏行 scripts 動作,可
⽤用此種⽅方式觸發
• 範例:
$	
  composer	
  run-­‐script	
  post-­‐root-­‐package-­‐install	
  
$	
  composer	
  run-­‐script	
  post-­‐install-­‐cmd	
  
$	
  composer	
  run-­‐script	
  post-­‐create-­‐project-­‐cmd
$	
  composer	
  run-­‐script	
  {event}
(執⾏行 composer.json 內的 script 動作)
Laravel	
  資料夾結構
★ 參考⽂文件:http://laravel.com/docs/5.1/structure
兩個 composer 檔案
根⺫⽬目錄底下有兩個 Composer 檔案:composer.json 及 composer.lock,
是⽤用來設定 Laravel 套件相依性之⽤用
Laravel 的 composer.json
{	
  
	
   "name":	
  "{vendor}/{package-­‐name}",	
  
	
   "description":	
  "{package	
  description}",	
  
	
   "keywords":	
  ["{keyword1}",	
  "{keyword2}"],	
  
	
   "license":	
  "{license}",	
  
	
   "type":	
  "project",	
  
	
   "require":	
  {	
  
	
   	
   "php":	
  ">=5.5.9",	
  
	
   	
   "laravel/framework":	
  "5.1.*"	
  
	
   },	
  
	
   "require-­‐dev":	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  "fzaninotto/faker":	
  "~1.4",	
  
	
  	
  	
  	
  	
  	
  	
  	
  "mockery/mockery":	
  "0.9.*",	
  
	
  	
  	
  	
  	
  	
  	
  	
  "phpunit/phpunit":	
  "~4.0",	
  
	
  	
  	
  	
  	
  	
  	
  	
  "phpspec/phpspec":	
  "~2.1"	
  
	
   },	
  
	
  	
  	
  /*	
  以下暫略	
  */	
  
}
私有專案⽤用:proprietary
格式:"vendor/package-­‐name":	
  "version"
composer.lock 的作⽤用
• 每當 Composer 分析完套件相依性、決定此次要安
裝的元件時,就會將每⼀一個元件的安裝版本資訊寫
⼊入 composer.lock 檔內
• 如同其名,lock 檔的作⽤用就是把⺫⽬目前的相依性「鎖
定」在這個檔案裡。換⾔言之,當團隊內的其他成員
拿到源始碼時,只要執⾏行 composer	
  install,就
可以安裝⼀一模⼀一樣的元件版本,避免發⽣生成員間因
元件版本不同⽽而產⽣生的開發錯誤
• 總⾔言之,請把 composer.lock 放⼊入版本控制系統內
app
app 是 Laravel 程式核⼼心 class 集中放置處,由於 Laravel 5.1 已全⾯面⽀支
援 PSR-4 規範,在此資料夾內新增 class 時,請依規範加 namespace
PSR-4 載⼊入設定
{	
  
	
  	
  	
  /*	
  以上暫略	
  */	
  
	
   "autoload":	
  {	
  
	
   	
   "classmap":	
  [	
  
	
   	
   	
   "database"	
  
	
   	
   ],	
  
	
   	
   "psr-­‐4":	
  {	
  
	
   	
   	
   "App":	
  "app/"	
  
	
   	
   }	
  
	
   },	
  
	
   "autoload-­‐dev":	
  {	
  
	
   	
   "classmap":	
  [	
  
	
   	
   	
   "tests/TestCase.php"	
  
	
   	
   ]	
  
	
   },	
  
	
  	
  	
  /*	
  以下暫略	
  */	
  
}
依	
  PSR-­‐4	
  載⼊入	
  class	
  設定	
  
新增	
  class	
  在	
  app	
  資料夾
時,請注意	
  namespace
bootstrap
bootstrap 是 Laravel 的啟始引擎,功能在於呼叫 Composer 的⾃自動載
⼊入以及啟動 App 核⼼心物件。底下的 cache 資料夾是⽤用來存放框架啟動
最佳化的快取檔
config
config 是 Laravel 放置所有設定檔的資料夾,不論是 Laravel 原⽣生提供
的設定或是其他套件提供的設定檔皆是放置在此
database
database 資料夾內有 3 個⼦子資料夾。migrations 放置所有資料庫變更紀
錄的操作 class;seeds 則是放置產⽣生測試假資料⽤用的 class;factories
則是 5.1 新增產⽣生 Model 欄位資料對應的 class
public
public 資料夾是 HTTP 伺服器設定 Document Root 的位置,裡⾯面的
index.php 是應⽤用程式進⼊入點,還包括所有公開檔案如 favicon.ico…
resources
resources 資料夾內有三個資料夾,分別放置 views 樣板檔案、lang 多
國語系對照表以及 assets 各種前端素材
storage
storage 資料夾存放所有框架動態產⽣生的檔案,包括:編譯過的 view、
儲存的 session 紀錄、快取、log 等…
tests
tests 資料夾存放所有關於測試⽤用的檔案,Laravel 內定使⽤用 PHPUnit
來做測試,裡⾯面已經有⼀一個範例檔在其中
vendor
vendor 資料夾是所有透過 Composer 安裝的第三⽅方套件,⼀一般⽽而⾔言不
需要更動裡⾯面的內容,在版本控制系統裡也會忽略它
建⽴立第⼀一個	
  git	
  存檔點
開啟書籤管理
新增⼀一個儲存庫
操作介⾯面
書籤管理
常⽤用功能鈕
working directory
staging area
檔案差異
儲存庫⾴頁籤
儲存⼀一個版本
加⼊入檔案
輸⼊入儲存紀錄
瀏覽 git 線圖
git ⼯工作流程概念
★ 圖⽚片來源:http://thkoch2001.github.io/whygitisbetter/images/local-remote.png
.gitignore
• 有⼀一些檔案 (⽐比⽅方說 IDE 的設定檔) 我們不想要放到
版本控制系統裡,希望 git 可以⾃自動忽略這些檔案
• 只要把想忽略的規則寫⼊入 .gitignore 裡並 commit 到
儲存庫,⽇日後 git 就會⾃自動忽略這些檔案
存檔點
• 試著把現在已經可以運作的程式碼加⼊入版本控制內
• 流程提醒:
- 建⽴立⼀一個新的儲存庫
- working directory > staging area > commit
Laravel	
  環境設定
★ 參考⽂文件:http://laravel.com/docs/5.1/installation#environment-configuration
開發流程與階段
[ development ]
開發⽤用、測試⽤用
[ local ]
本機端開發
[ staging ]
階段性發佈
[ production ]
正式上線
每個開發夥伴本機端
獨⽴立開發,開發完成
後送回版本控制系統
[version control]
原始碼管理
定期從版本控制系統
取出後,進⾏行整合、
單元等測試
專案階段完成後,進
⾏行階段性發佈,給客
⼾戶測試、確認
所有階段完成後佈署
⾄至正式主機,對外公
開使⽤用
什麼是環境設定?
• 如上圖,在⼀一個網路應⽤用程式的開發過程中,程式
碼會依照不同的開發階段被部署在不同的機器上
• 常⾒見的實際狀況是,不同開發階段的機器可能會有
不同的設定值,如 DB 名稱、DB 帳號、DB 密碼等
• 在以往的作法裡,可能會將這些設定值寫死在⼀一個
config.php 的檔案內,並在所有的⾴頁⾯面裡載⼊入
• 將設定值寫死在程式碼內並放到版本控制系統裡,
除了會有機敏資訊曝光的⾵風險,在更換機器時也會
需求⼿手動修改這個檔案以適應不同的機器,無法讓
部署流程⾃自動化
Laravel 的環境設定設計
• Laravel 的環境設定設計,是透過在根⺫⽬目錄放置⼀一
個 .env 的設定檔,在設定檔內紀錄所有的設定值。
⽽而在程式運⾏行時,透過 env('CONFIG_KEY') 載⼊入
設定檔內的設定值
• .env 這個檔案預設就設定在 .gitignore 裡排除。也就
是說,.env 這個檔案不會被送⼊入版本控制系統內,
以免除機敏資訊被公開的⾵風險
• 透過環境變數的設計,讓程式碼可動態適應不同機
器上的不同設定,減少佈署時需⼿手動調整設定的負
擔
如何知道⺫⽬目前的環境?
$	
  php	
  artisan	
  env
使⽤用 artisan 指令查詢⺫⽬目前的環境
什麼是 artisan?
• Laravel 專屬的指令列⼯工具,協助我們完成⽇日常繁瑣
⼯工作事務,如:
• 最佳化 (optimize) 應⽤用程式
- 清快取 (cache)、控制 queue
- tinker 模式、maintenance 模式
• 可簡化眾多開發⼯工作及時程,如:
- ⾃自動幫忙產⽣生想要的 class skeleton,少打⼀一些鍵盤
- ⾃自動最佳化 Laravel、啟動常⽤用的⼯工具
$	
  [php]	
  artisan	
  env
了解⺫⽬目前	
  Laravel	
  使⽤用的環境設定
artisan	
  env
• 回傳 Laravel ⺫⽬目前所在環境
- artisan 會回傳⺫⽬目前 Laravel ⺫⽬目前的環境變數設定
• 範例:
$	
  php	
  artisan	
  env
如何修改環境設定?
APP_ENV=local	
  
APP_DEBUG=true	
  
APP_KEY=SomeRandomString	
  
DB_HOST=localhost	
  
DB_DATABASE=homestead	
  
DB_USERNAME=homestead	
  
DB_PASSWORD=secret
編輯 .env 檔案
透過 artisan 驗證
$	
  php	
  artisan	
  env
設定/產⽣生 APP_KEY
• 在環境設定檔 (.env) 裡,有⼀一個 APP_KEY,是
Laravel 在應⽤用程式運作時,⽤用做加密運算使⽤用的
Key 值,其為⼀一組 32 字元⻑⾧長的隨機字串
• 在建⽴立新專案時,Composer 會透過 post-­‐create-­‐
project-­‐cmd 內的指令來產⽣生⼀一組新的 Key,並將
其紀錄在 .env 檔案內
• 產⽣生 APP_KEY 也可以透過 artisan 指令來重新產
⽣生
$	
  [php]	
  artisan	
  key:generate
產⽣生	
  Laravel	
  要使⽤用的	
  APP_KEY	
  並存在	
  .env	
  內
artisan	
  key:generate
• 產⽣生 APP_KEY
- artisan 會產⽣生⼀一組 32 字元⻑⾧長的隨機字串,並將其
紀錄在 .env 裡
• 範例:
$	
  php	
  artisan	
  key:generate	
  
Application	
  key	
  [xxxxxxxxxxxxxxxxxx]	
  set	
  successfully
單元總結
• 在這個單元裡我們學到了些什麼?
- 透過兩種⽅方式建⽴立新的 Laravel 專案
- 了解 Laravel 的專案資料夾結構
- 如何設定 Laravel 的環境變數
- 學習使⽤用 artisan 指令列⼯工具
Q & A
歡迎提問討論

啟動 Laravel 與環境設定