# 服務器要求
Laravel 框架對PHP版本和擴展有一定要求,不過這些要求 `Laravel Homestead` 都已經滿足了,不過如果你沒有使用 Homestead 的話(那真是一件很遺憾的事情),有必要了解下這些以便確認自己的環境滿足要求:
* PHP >= 7.1.3
* PHP OpenSSL 擴展
* PHP PDO 擴展
* PHP Mbstring 擴展
* PHP Tokenizer 擴展
* PHP XML 擴展
* PHP Ctype 擴展
* PHP JSON 擴展
滿足以上需求之后,就可以開始安裝 Laravel 了。
# 安裝 Laravel
Laravel 使用 `Composer` 管理依賴,所以,安裝之前確保已經在機器上安裝了 Composer(如果尚未安裝的話參考這份文檔去安裝吧)。
**通過 Laravel 安裝器**
首先,通過 Composer 安裝 Laravel 安裝器:
~~~
composer global require "laravel/installer"
~~~
確保 `$HOME/.composer/vendor/bin` 在系統路徑中(Mac中對應路徑是 `~/.composer/vendor/bin`,Windows對應路徑是 `~/AppData/Roaming/Composer/vendor/bin`,其中 `~` 表示當前用戶家目錄),否則不能在命令行任意路徑下調用 `laravel` 命令。
安裝完成后,通過簡單的 `laravel new` 命令即可在當前目錄下創建一個新的 Laravel 應用,例如,`laravel new blog` 將會創建一個名為 `blog` 的新應用,且包含所有 Laravel 依賴。該安裝方法比通過 Composer 安裝要快很多:
~~~
laravel new blog
~~~
如果之前已經安裝過舊版本的 Laravel 安裝器,需要更新后才能安裝最新的 Laravel 5.6 框架應用:
~~~
composer global update
~~~
**通過 Composer Create-Project**
你還可以在終端中通過 Composer 的 `create-project` 命令來安裝 Laravel 應用:
~~~
composer create-project --prefer-dist laravel/laravel blog
~~~
如果要下載安裝 Laravel 其他版本應用,比如 5.5 版本,可以使用這個命令:
~~~
composer create-project --prefer-dist laravel/laravel blog 5.5.*。
~~~
**本地開發服務器**
如果你在本地安裝了 PHP,并且想要使用 PHP 內置的開發環境服務器為應用提供服務,可以使用 Artisan 命令 `serve`:
~~~
php artisan serve
~~~
該命令將會在本地啟動開發環境服務器,這樣在瀏覽器中通過 http://localhost:8000 即可訪問應用:
:-: 
當然,更強大的本地開發環境選擇還是 `Homestead` 和 Valet。
# 配置 Laravel
## 初始化配置
**公共目錄**
安裝完 Laravel 后,需要將 Web 服務器的 document/web 根目錄指向 Laravel 應用的 public 目錄,該目錄下的 `index.php` 文件作為前端控制器(單一入口),所有 HTTP 請求都會通過該文件進入應用。
**配置文件**
Laravel 框架的所有配置文件都存放在 `config` 目錄下,所有的配置項都有注釋,所以你可以輕松遍覽這些配置文件以便熟悉所有配置項。
**目錄權限**
安裝完 Laravel 后,需要配置一些目錄的讀寫權限:`storage` 和 `bootstrap/cache` 目錄對 Web 服務器指定的用戶而言應該是可寫的,否則 Laravel 應用將不能正常運行。如果你使用 Homestead 虛擬機做為開發環境,這些權限已經設置好了。
應用key
接下來要做的事情就是將應用的 key(APP_KEY)設置為一個隨機字符串,如果你是通過 Composer 或者 Laravel 安裝器安裝的話,該 key 的值已經通過 `php artisan key:generate` 命令生成好了。
通常,該字符串應該是 32 位長,通過 `.env` 文件中的 `APP_KEY` 進行配置,如果你還沒有將 `.env.example` 文件重命名為 `.env`,現在立即這樣做。**如果應用 key 沒有被設置,用戶 Session 和其它加密數據將會有安全隱患!**
更多配置
Laravel 幾乎不再需要其它任何配置就可以正常使用了,不過,你最好再看看 config/app.php 文件,其中包含了一些基于應用可能需要進行改變的配置,比如 timezone 和 locale(分別用于配置時區和本地化)。
你可能還想要配置 Laravel 的一些其它組件,比如緩存、數據庫、Session 等,關于這些我們將會在后續文檔一一探討。
## Web 服務器配置
關于虛擬主機的配置(映射域名到Laravel應用目錄)略過,如果了解細節可參考這篇教程,當然也可以留待下一篇講 Homestead 和 Valet 再去了解。本文只探討如何美化 URL 讓其更具有可讀性。
**Apache**
框架中自帶的 `public/.htaccess` 文件支持隱藏 URL 中的 `index.php`,如過你的 Laravel 應用使用 Apache 作為服務器,需要先確保 Apache 啟用了`mod_rewrite` 模塊以支持 `.htaccess` 解析。
如果 Laravel 自帶的 `.htaccess` 文件不起作用,試試將其中內容做如下替換:
~~~
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
~~~
**Nginx**
如果你使用的是 Nginx,使用如下站點配置指令就可以支持 URL 美化:
~~~
location / {
try_files $uri $uri/ /index.php?$query_string;
}
~~~
當然,使用 Homestead 或 Valet 的話,以上配置已經為你配置好,無需額外操作。
## 環境配置
基于應用運行的環境不同設置不同的配置值能夠給我們開發帶來極大的方便,比如,我們通常在本地和線上環境配置不同的緩存驅動,這一功能在 Laravel 中很容易實現。
Laravel 使用 PHP 擴展庫 `DotEnv` 來實現這一功能,在新安裝的 Laravel 中,根目錄下有一個 `.env.example` 文件,如果 Laravel 是通過 Composer 安裝的,那么該文件已經被重命名為 `.env`,否則的話你要自己手動重命名該文件。
不要試圖將 `.env` 文件提交到版本控制系統(如Git或Svn)中,一方面,開發環境和線上環境配置值不一樣,提交沒有意義,更重要的是,`.env` 包含了很多應用敏感信息,如數據庫用戶名及密碼等,如果不慎將代碼提交到 Github 公開倉庫,后果將不堪設想!
如果你是在一個團隊中進行開發,則需要將 `.env.example` 文件隨你的應用代碼一起提交到源碼控制中:將一些配置值以占位符的方式放置在 `.env.example` 文件中,這樣其他開發者就會很清楚運行你的應用需要配置哪些環境變量。
還可以創建一個 `.env.testing` 文件,該文件會在運行 PHPUnit 測試或執行帶有 `--env=testing` 選項的 Artisan 命令時覆蓋從 `.env` 文件讀取的值。
> 注:`.env` 文件中的所有變量都可以被外部環境變量覆蓋,例如服務器級別或系統級別的環境變量。
## 獲取環境變量配置值
應用每次接受請求時,`.env` 中列出的所有配置及其對應值都會被載入到 PHP 超全局變量 `$_ENV` 中,然后你就可以在應用中通過輔助函數 `env` 來獲取這些配置值。實際上,如果你去查看 Laravel 的配置文件,就會發現很多地方已經在使用這個輔助函數了:
~~~
'debug' => env('APP_DEBUG', false),
~~~
傳遞到 `env` 函數的第二個參數是默認值,如果環境變量沒有被配置將會使用該默認值。
## 判斷當前應用環境
當前應用環境由 `.env` 文件中的 `APP_ENV` 變量決定,你可以通過 `App 門面`上的 `environment` 方法來訪問其值:
~~~
$environment = App::environment();
~~~
你也可以向 `environment` 方法傳遞參數來判斷當前環境是否匹配給定值,如果需要的話你甚至可以傳遞多個值。如果當前環境與給定值匹配,該方法返回 `true`:
~~~
if (App::environment('local')) {
// The environment is local
}
if (App::environment('local', 'staging')) {
// The environment is either local OR staging...
}
~~~
> 注:當前應用環境判斷可以被服務器級別環境變量 `APP_ENV` 覆蓋。當你需要在不同環境配置間共享同一應用時很有用,你可以在服務器配置中設置一個給定主機來匹配給定環境。
# 訪問配置值
你可以使用全局輔助函數 `config` 在應用代碼的任意位置訪問配置值,配置值以文件名+“.”+配置項的方式進行訪問,當配置項沒有被配置的時候返回默認值:
~~~
$value = config('app.timezone');
~~~
如果要在運行時設置配置值,傳遞數組參數到 `config` 方法即可:
~~~
config(['app.timezone' => 'Asia/Shanghai']);
~~~
# 緩存配置文件
為了給應用加速,你可以使用 Artisan 命令 `config:cache` 將所有配置文件的配置緩存到單個文件里,這將會將所有配置選項合并到單個文件從而被框架快速加載。
應用每次上線,都要運行一次 `php artisan config:cache`,但是在本地開發時,沒必要經常運行該命令,因為配置值經常會改變。
> 注:如果在部署過程中執行` config:cache` 命令,需要確保只在配置文件中調用了 `env` 方法。一旦配置文件被緩存后,`.env` 文件將不能被加載,所有對 `env` 函數的調用都會返回 `null`。
# 維護模式
當你的應用處于維護模式時,所有對應用的請求都應該返回同一個自定義視圖。這一功能在對應用進行升級或者維護時,使得“關閉”站點變得輕而易舉。對維護模式的判斷代碼位于應用默認的中間件棧中,如果應用處于維護模式,訪問應用時狀態碼為 `503` 的 `MaintenanceModeException` 將會被拋出。
要開啟維護模式,關閉站點,只需執行 Artisan 命令 `down` 即可:
~~~
php artisan down
~~~
還可以提供 `message` 和 `retry` 選項給 `down` 命令。`message` 的值用于顯示或記錄自定義消息,而 `retry` 的值用于設置 HTTP 請求頭的 `Retry-After`:
~~~
php artisan down --message="Upgrading Database" --retry=60
~~~
要關閉維護模式,開啟站點,對應的 Artisan 命令是 `up`:
~~~
php artisan up
~~~
> 注:你可以通過定義自己的模板來定制默認的維護模式模板,自定義模板視圖位于 `resources/views/errors/503.blade.php`。
## 維護模式 & 隊列
當你的站點處于維護模式中時,所有的`隊列任務`都不會執行;當應用退出維護模式這些任務才會被繼續正常處理。
## 維護模式的替代方案
由于維護模式命令的執行需要幾秒時間,你可以考慮使用 `Envoyer` 實現零秒下線作為替代方案。
- 序言
- 新版特性
- 快速入門
- 升級指南
- 貢獻指南
- API文檔
- 安裝配置
- 目錄結構
- Homestead
- Valet
- 部署
- 核心概念
- 請求生命周期
- 服務容器
- 服務提供者
- 門面(Facades)
- 契約(Contracts)
- 框架基礎
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 生成 URL
- Session
- 驗證
- 錯誤處理
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端腳手架
- 編譯前端資源(Laravel Mix)
- 安全系列
- 登錄認證
- API 認證
- 授權
- 加密
- 哈希
- 重置密碼
- 進階系列
- Artisan 控制臺
- 集合
- 廣播
- 緩存
- 事件
- 文件存儲
- 輔助函數
- 郵件
- 通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫操作
- 快速入門
- 查詢構建器
- 分頁
- 遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 關聯關系
- 集合
- 訪問器 & 修改器
- API 資源類
- 序列化
- 應用測試
- 快速入門
- HTTP 測試
- 瀏覽器測試
- 數據庫測試
- 模擬
- 官方擴展包
- Cashier(訂閱支付解決方案)
- Envoy(遠程操作解決方案)
- Horizon(隊列系統解決方案)
- Passport(API 認證解決方案)
- Scout(全文搜索解決方案)
- Socialite(第三方登錄解決方案)
- 相關下載
- Laravel 5.6 中文文檔離線版
- Laravel 5.6 一鍵安裝包