* * * * *
[TOC]
## 簡介
Valet 是 Mac 極簡主義者的 Laravel 開發環境。沒有 Vagrant,不需要配置?`/etc/hosts`?文件。甚至可以使用本地隧道公開分享你的站點。 Yeah, we like it too.
Laravel Valet 為您的 Mac 設置了開機后始終在后臺運行?[Nginx](https://www.nginx.com/)?服務。 然后,Valet 使用?[DnsMasq](https://en.wikipedia.org/wiki/Dnsmasq)?將所有指向安裝在本地的計算機站點請求代理到?`*.test`?結尾的域名上。
換句話說,一個速度極快的 Laravel 開發環境只占用 7MB 內存。Valet 并不是想要完全替換 Vagrant 或 Homestead,只是提供另外一種使用起來更加靈活、方便、以及內存占用更小的選擇。
Valet 支持但不局限于以下內容:
* [Laravel](https://laravel.com/)
* [Lumen](https://lumen.laravel.com/)
* [Bedrock](https://roots.io/bedrock/)
* [CakePHP 3](https://cakephp.org/)
* [Concrete5](https://www.concrete5.org/)
* [Contao](https://contao.org/en/)
* [Craft](https://craftcms.com/)
* [Drupal](https://www.drupal.org/)
* [Jigsaw](http://jigsaw.tighten.co/)
* [Joomla](https://www.joomla.org/)
* [Katana](https://github.com/themsaid/katana)
* [Kirby](https://getkirby.com/)
* [Magento](https://magento.com/)
* [OctoberCMS](https://octobercms.com/)
* [Sculpin](https://sculpin.io/)
* [Slim](https://www.slimframework.com/)
* [Statamic](https://statamic.com/)
* Static HTML
* [Symfony](https://symfony.com/)
* [WordPress](https://wordpress.org/)
* [Zend](https://framework.zend.com/)
當然, 您也可以使用?[自定義驅動](http://www.hmoore.net/tonyyu/laravel_5_6/786196#_Valet__142)?來擴展您的 Valet。
### Valet 還是 Homestead
您應該知道,Laravel 還提供了另外一種本地開發環境?[Homestead](http://www.hmoore.net/tonyyu/laravel_5_6/786195)。 Homestead 和 Valet 的不同之處在于目標受眾和本地開發的方式。Homestead 提供了一個完整的、具有自動化的 Nginx 配置的 Ubuntu 虛擬機。如果你想要完全虛擬化的 Linux 開發環境或 Windows/Linux,Homestead 是一個不錯的選擇。
Valet 僅支持 Mac,并要求你將 PHP 和數據庫服務器直接安裝到本地機器上。這可以很容易地通過使用?[Homebrew](http://brew.sh/)?命令來實現,比如?`brew install php72`?和?`brew install mysql`。Valet 提供了一個極快的、資源消耗最少本地開發環境,非常適合只需要 PHP/MySQL 并且不需要虛擬開發環境的開發人員。
Valet 和 Homestead 都是配置 Laravel 開發環境的絕佳選擇。選擇哪一個僅僅取決于個人喜好和團隊的需求。
## 安裝
**Valet 需要 macOS 和?[Homebrew](http://brew.sh/)。在安裝之前,要確保沒有其它程序(如 Apache 或 Nginx)占用了本地機器的 80 端口。**
* 使用?`brew update`?將?[Homebrew](http://brew.sh/)?安裝或更新到最新版本。
* 通過 Homebrew 使用?`brew install php@7.2`?命令安裝 PHP 7.2。
* 通過 Composer 使用?`composer global require laravel/valet`?命令安裝 Valet 。確保?`~/.composer/vendor/bin`?目錄位于系統的 "PATH" 中。
* 運行?`valet install`?命令來配置和安裝 Valet 和 DnsMasq,并注冊 Valet 后臺服務,隨系統運行自行啟動。
安裝完 Valet 后,可以嘗試使用類似?`ping foobar.test`?的命令在終端上 ping 任何一個?`*.test`?的域名。如果 Valet 安裝正確,可以在終端上看到來自?`127.0.0.1`?的響應。
每次機器啟動時,Valet 會自動啟動其進程。所以只要完成了 Valet 的初始化,就無需再次運行?`valet start`?或?`valet install`?。
#### 使用其它域名
默認情況下,Valet 使用?`.test`?頂級域名為你的項目提供服務。如果你想使用其它域名,可以使用?`valet domain tld-name`?命令。
例如,如果你要使用?`.app`?而不是?`.test`?,就運行?`valet domain app`?,Valet 會自動將站點域名改為?`*.app`。
#### 數據庫
如果你要使用數據庫,就在終端運行?`brew install mysql`?安裝 MySQL。安裝完成后,你可能需要使用?`brew services start mysql`?命令來啟動服務。你可以使用?`root`?作為用戶名和空字符串作為密碼連接到?`127.0.0.1`?的數據庫。
### 升級
你可以在終端使用?`composer global update`?命令來更新 Valet 。升級后,如有需要,最好再運行一次?`valet install`?,以便 Valet 可以對配置文件進行升級。
#### 升級到 Valet 2.0
Valet 2.0 將 Valet 底層的 Web 服務器從 Caddy 轉移到 Nginx。升級到此版本之前,你應該運行以下命令停止并卸載現有的 Caddy 進程:
~~~
valet stop
valet uninstall
~~~
接下來,就根據你如何采用的安裝方式來升級 Valet (通常是通過 Git 或 Composer )。如果是通過 Composer 安裝了 Valet ,則應使用以下命令更新到最新的主要版本:
~~~
composer global require laravel/valet
~~~
如果更新了 Valet 的源碼,你應該執行?`install`?命令:
~~~
valet install
valet restart
~~~
升級過后,可能需要重新設置或重新鏈接你的站點。
## 服務站點
安裝了 Valet 之后,你就可以開始設置站點。Valet 提供兩個命令來為 Laravel 的站點提供服務:`park`?和?`link`?。
**`park`?命令**
* 運行?`mkdir ~/Sites`?命令在 Mac 上創建一個新的目錄。接下來,運行?`cd ~/Sites`?和?`valet park`?將當前的工作目錄作為 Valet 搜索站點的路徑。
* 接下來,在這個目錄中創建一個新的 Laravel 站點:`laravel new blog`?。
* 在瀏覽器中打開?`http://blog.test`?。
**就這么多。**?現在,你在 『parked』的目錄中創建的任何 Laravel 項目都將自動使用?`http://folder-name.test`?這種方式訪問。
**`link`?命令**
如果要在目錄中提供單個站點而不是整個目錄,就使用?`link`?命令。
* 要使用該命令,先在終端里切換到你的某個項目并運行?`valet link app-name`?。Valet 會在?`~/.valet/Sites`中創建一個符號鏈接指向當前的目錄。
* 運行?`link`?命令后,你可以在瀏覽器通過?`http://app-name.test`?訪問站點。
運行?`valet links`?命令可以查看所有目錄鏈接的列表。你還可以使用?`valet unlink app-name`?來刪除符號鏈接。
> {tip} 你可以使用?`valet link`?將多個(子)域名指向同一個應用。要添加子域名或其它域名到應用,可以在應用目錄下運行?`valet link subdomain.app-name`?。
**使用 TLS 構建安全站點**
默認情況下,Valet 使用 HTTP 協議提供站點。但是,如果你想使用 HTTP/2 提供加密的 TLS 站點,使用?`secure`?命令。例如,如果你的站點域名是?`laravel.test`?,可以這樣:
~~~
valet secure laravel
~~~
要還原為 HTTP ,使用?`unsecure`?命令。想?`secure`?命令一樣,此命令接受你要取消安全加密的站點名稱:
~~~
valet unsecure laravel
~~~
## 分享站點
Valet 甚至包括與全世界分享你的本地網站的命令。一旦安裝了 Valet ,就不需要額外的軟件安裝。
要共享站點,先在終端切換到站點目錄,然后運行?`valet share`?命令。將可公開訪問的網址插入剪貼板,然后直接粘貼到瀏覽器中訪問。就這么簡單~
要停止分享你的網站按?`Control + C`?取消分享。
> {note}?`valet share`?目前不支持使用?`valet secure`?命令保護共享的站點。
## 自定義 Valet 驅動
你可以編寫自己的 Valet 「驅動」來提供運行在另一個不是由 Valet 支持的框架或 CMS 上的 PHP 應用程序。安裝 Valet 時,會創建一個包含?`SampleValetDriver.php`?文件?`~/.valet/Drivers`?目錄。這個文件包含實現驅動程序的例子,演示了如何編寫自定義驅動程序。編寫驅動程序只需要實現三種方法:`serves`、?`isStaticFile`?和`frontControllerPath`。
這三種方法都會收到?`$sitePath`、`$siteName`?和?`$uri`?值作為參數。`$sitePath`?是計算機上提供的站點的完整路徑,例如?`/Users/Lisa/Sites/my-project`。`$siteName`?是 「主機」 / 「站點名」 的域名部分,如?`my-project`。?`$uri`?則是輸入的請求地址,如?`/foo/bar`。
完成自定義 Valet 驅動后,使用?`FrameworkValetDriver.php`?這樣的命名將其放在?`~/.valet/Drivers`?目錄中。例如,如果你正在為 WordPress 編寫自定義 Valet 驅動程序,那你的文件名應該是?`WordPressValetDriver.php`。
接下來看看自定義 Valet 驅動應該實現的每種方法的實現示例。
#### `serves`?方法
如果你的驅動程序應該處理傳入的請求,那么?`serves`?方法應該返回?`true`。否則,該方法應返回?`false`。因此,在此方法中,你需要確定給定的?`$sitePath`?是否包含你要提供的類型的項目。
例如,假設我們正在編寫一個?`WordPressValetDriver`。`serve`?方法可能如下所示:
~~~
/**
* 確定驅動程序是否提供請求。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return is_dir($sitePath.'/wp-admin');
}
~~~
#### `isStaticFile`?方法
`isStaticFile`?應該確定傳入的請求是否是一個「靜態」的文件,如圖像或樣式表。如果文件是靜態的,該方法應該將完整的路徑返回到磁盤上的靜態文件。如果傳入的請求不是靜態文件,則該方法應返回?`false`:
~~~
/**
* 確定傳入請求是否為靜態文件。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string|false
*/
public function isStaticFile($sitePath, $siteName, $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
return $staticFilePath;
}
return false;
}
~~~
> {note} 只有當傳入請求的?`serves`?方法返回?`true`?并且請求的 URI 不是?`/`?時,才會調用?`isStaticFile`?方法。
#### `frontControllerPath`?方法
`frontControllerPath`?方法會返回完整的路徑到你應用的「前端控制器」,這通常是你的「index.php」文件或其它同等文件:
~~~
/**
* 獲取應用程序前端控制器的完全解析路徑。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public/index.php';
}
~~~
### 本地驅動
如果要為單個應用定義一個自定義 Valet 驅動程序,請在應用程序的根目錄中創建?`LocalValetDriver.php`?文件。你的自定義驅動程序可以繼承基礎?`ValetDriver`?類或繼承現有應用的特定驅動程序,如?`LaravelValetDriver`:
~~~
class LocalValetDriver extends LaravelValetDriver
{
/**
* 確定驅動程序是否提供請求。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return true;
}
/**
* 獲取應用程序前端控制器的完全解析路徑。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public_html/index.php';
}
}
~~~
## 其它 Valet 命令
| 命令 | 注釋 |
| --- | --- |
| `valet forget` | 在被「parked」的目錄中運行這個命令,能夠將這個目錄從「parked」目錄列表中刪除。 |
| `valet paths` | 查看所有「parked」過的路徑。 |
| `valet restart` | 重啟 Valet。 |
| `valet start` | 啟動 Valet。 |
| `valet stop` | 停止 Valet。 |
| `valet uninstall` | 卸載 Valet。 |
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄