# Valet
- [簡介](#introduction)
- [Valet 還是 Homestead ?](#valet-or-homestead)
- [安裝](#installation)
- [升級](#upgrading)
- [服務站點](#serving-sites)
- [Park 命令](#the-park-command)
- [Link 命令](#the-link-command)
- [使用 TLS 構建安全站點](#securing-sites)
- [分享站點](#sharing-sites)
- [自定義 Valet 驅動](#custom-valet-drivers)
- [本地驅動](#local-drivers)
- [其他 Valet 命令](#other-valet-commands)
<a name="introduction"></a>
## 簡介
Valet 是 Mac 極簡主義者的 Laravel 開發環境。沒有 Vagrant,沒有 `/etc/hosts` 文件。甚至可以使用本地隧道公開分享你的站點。 _Yeah, we like it too._
Laravel Valet 為你的 Mac 設置了啟動后始終在后臺運行 Nginx。然后,Valet 使用 [DnsMasq](https://en.wikipedia.org/wiki/Dnsmasq) 將所有指向安裝在本地計算機的站點的請求代理到 `*.dev` 域上。
換句話說,一個速度極快的 Laravel 開發環境只占用 7MB 內存。Valet 并不是想要完全替換 Vagrant 或 Homestead,只是提供另外一種使用起來更加靈活、方便、以及內存的占用更小的選擇。
Valet 支持但不局限于以下內容:
<div class="content-list" markdown="1">
- [Laravel](https://laravel.com)
- [Lumen](https://lumen.laravel.com)
- [Bedrock](https://roots.io/bedrock/)
- [CakePHP 3](https://cakephp.org)
- [Concrete5](http://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/)
- [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)
</div>
However, you may extend Valet with your own [custom drivers](#custom-valet-drivers).
你可以使用 [自定義驅動](#custom-valet-drivers) 來擴展 Valet。
<a name="valet-or-homestead"></a>
### Valet 還是 Homestead?
Laravel 還提供了另一種本地開發環境 [Homestead](/docs/{{version}}/homestead)。Homestead 和 Valet 的不同之處在于目標受眾和對本地開發的方式。Homestead 提供了一個完整的、具有自動化的 Nginx 配置的 Ubuntu 虛擬機。如果你想要完全虛擬化的 Linux 開發環境或 Windows/Linux,Homestead 是一個不錯的選擇。
Valet 僅支持 Mac,并要求你將 PHP 和數據庫服務器直接安裝到本地機器上。這可以很容易地通過使用 Homebrew 命令來實現,像 `brew install php71` 和 `brew install mysql`。Valet 提供了一個極快的、資源消耗最少本地開發環境,非常適合只需要 PHP/MySQL 并且不需要虛擬開發環境的開發人員。
Valet 和 Homestead 都是配置 Laravel 開發環境的絕佳選擇。選擇哪一個僅僅只是取決于個人喜好和團隊的需求。
<a name="installation"></a>
## 安裝
**Valet 需要 macOS 和 [Homebrew](http://brew.sh/)。在安裝之前,要確保沒有其他程序(如 Apache 或 Nginx )占用了本地機器的端口 80。**
<div class="content-list" markdown="1">
- 使用 `brew update` 將 Homebrew 安裝或更新到最新版本。
- 通過 Homebrew 使用 `brew install homebrew/php/php71` 命令安裝 PHP 7.1 。
- 通過 Composer 使用 `composer global require laravel/valet` 安裝 Valet。確保 `~/.composer/vendor/bin` 目錄位于系統的「PATH」中。
- Run the `valet install` command. This will configure and install Valet and DnsMasq, and register Valet's daemon to launch when your system starts.
- 運行 `valet install` 命令來配置和安裝 Valet 和 DnsMasq,并注冊 Valet 后臺隨機啟動。
</div>
安裝完 Valet,使用 `ping foobar.dev` 命令在終端上的 ping 任何一個 `*.dev` 的域名。如果 Valet 安裝正確,可以在終端上看到來自 `127.0.0.1` 的響應。
每次機器啟動時,Valet 會自動啟動其進程。所以只要完成了 Valet 的初始化,就無需再次運行 `valet start` 或 `valet install`。
#### 使用其它域名
默認情況下,Valet 使用 `.dev` 頂級域名為你的項目提供服務。如果你想使用其他域名,可以使用 `valet domain tld-name` 命令。
例如,如果你要使用 `.app` 而不是 `.dev`,就運行 `valet domain app`,Valet 會自動將站點域名改為 `*.app`。
#### 數據庫
如果你要用數據庫,在終端運行 `brew install mysql` 安裝 MySQL。安裝完后,你可以使用 `brew services start mysql` 命令啟動它。然后,你可以使用 `root` 作為用戶名和空字符串作為密碼連接到 `127.0.0.1` 的數據庫。
<a name="upgrading"></a>
### 升級
你可以在使用終端使用 `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
因為升級后,可能需要重新設置或重新鏈接你的站點。
<a name="serving-sites"></a>
## 服務站點
安裝了 Valet 之后,你就可以開始設置站點。Valet 提供兩個命令來為 Laravel 的站點提供服務:`park` 和 `link`。
<a name="the-park-command"></a>
**`park` 命令**
<div class="content-list" markdown="1">
- 運行 `mkdir ~/Sites` 命令在 Mac 上創建一個新的目錄。接下來,運行 `cd ~/Sites` 和 `valet park` 將當前的工作目錄作為 Valet 搜索站點的路徑。
- 接下來,在這個目錄中創建一個新的 Laravel 站點:`laravel new blog`。
- 在瀏覽器中打開 `http://blog.dev`。
</div>
**就這么多。**現在,你在 「parked」的目錄中創建的任何 Laravel 項目將自動使用 `http://folder-name.dev` 這種方式訪問。
<a name="the-link-command"></a>
**`link` 命令**
如果要在目錄中提供單個站點而不是整個目錄,就使用 `link` 命令。
<div class="content-list" markdown="1">
- 要使用該命令,先切換到你的某個項目并運行 `valet link app-name`。Valet 會在 `~/.valet/Sites` 中創建一個符號鏈接指向當前的目錄。
- 運行 `link` 命令后,你可以在瀏覽器通過 `http://app-name.dev` 訪問站點。
- </div>
運行 `valet links` 命令可以查看所有目錄鏈接的列表。你還可以使用 `valet unlink app-name` 來刪除符號鏈接。
> {tip} 你可以使用 `valet link` 將多個(子)域指向同一個應用。要添加子域名或其它域名到應用,可以在應用目錄下運行 `valet link subdomain.app-name`。
<a name="securing-sites"></a>
**使用 TLS 構建安全站點**
默認情況下,Valet 使用 HTTP 協議提供站點。但是,如果你想使用 HTTP/2 提供加密的 TLS 站點,使用 `secure` 命令。例如,如果你的站點域名是 `laravel.dev`,可以這樣:
valet secure laravel
要還原為 HTTP,使用 `unsecure` 命令。像 `secure` 命令一樣,此命令接受你要取消安全加密的站點名稱:
valet unsecure laravel
<a name="sharing-sites"></a>
## 分享站點
Valet 甚至包括與世界分享你的本地網站的命令。一旦安裝了 Valet,就不需要額外的軟件安裝。
要共享站點,先在終端切換到站點目錄,然后運行 `valet share` 命令。將可公開訪問的網址插入剪貼板,然后直接粘貼到瀏覽器中訪問。就這么簡單~
要停止分享你的網站,按 `Control + C` 取消分享。
> {note} `valet share` 目前不支持使用 `valet secure` 命令保護共享的站點。
<a name="custom-valet-drivers"></a>
## 自定義 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';
}
<a name="local-drivers"></a>
### 本地驅動
如果要為單個應用定義一個自定義 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';
}
}
<a name="other-valet-commands"></a>
## 其它 Valet 命令
| 命令 | 注釋 |
| ------------- | -------------
| `valet forget` | 在被「parked」的目錄中運行這個命令,能夠將這個命令從「parked」目錄列表中刪除。 |
| `valet paths` | 查看所有「parked」過的路徑。|
| `valet restart` | 重啟 Valet |
| `valet start` | 啟動 Valet |
| `valet stop` | 停止 Valet |
| `valet uninstall` | 卸載 Valet |
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
|---|---|---|---|
| [@JokerLinly](https://laravel-china.org/users/5350) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/5350_1481857380.jpg"> | 翻譯 | Stay Hungry. Stay Foolish. |
---
> {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。
>
> 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。
>
> 文檔永久地址: https://d.laravel-china.org
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- HomeStead
- Valet
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- 門面(Facades)
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 重定向
- Session
- 表單驗證
- 錯誤與日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- API認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 交流說明