Valet
Valet
Laravel Valet
簡介
Valet 是 Mac 極簡主義者的 Laravel 開發(fā)環(huán)境。沒有 Vagrant,不需要配置 /etc/hosts
文件。 甚至可以使用本地隧道公開分享你的站點。 Yeah, we like it too.
Laravel Valet 為您的 Mac 設(shè)置了開機(jī)后始終在后臺運行 Nginx 服務(wù)。 然后,Valet 使用 DnsMasq 將所有指向安裝在本地的計算機(jī)站點請求代理到 *.test
結(jié)尾的域名上。
換句話說,一個速度極快的 Laravel 開發(fā)環(huán)境只占用 7MB 內(nèi)存。Valet 并不是想要完全替換 Vagrant 或 Homestead,只是提供另外一種使用起來更加靈活、方便、以及內(nèi)存占用更小的選擇。
Valet 支持但不局限于以下內(nèi)容:
- Laravel
- Lumen
- Bedrock
- CakePHP 3
- Concrete5
- Contao
- Craft
- Drupal
- Jigsaw
- Joomla
- Katana
- Kirby
- Magento
- OctoberCMS
- Sculpin
- Slim
- Statamic
- Static HTML
- Symfony
- WordPress
- Zend
當(dāng)然,您也可以使用 自定義驅(qū)動 來擴(kuò)展您的 Valet。
Valet 還是 Homestead
您應(yīng)該知道,Laravel 還提供了另外一種本地開發(fā)環(huán)境 Homestead。Homestead 和 Valet 的不同之處在于目標(biāo)受眾和本地開發(fā)的方式。Homestead 提供了一個完整的、具有自動化的 Nginx 配置的 Ubuntu 虛擬機(jī)。如果你想在 Windows/Linux 上實現(xiàn)完全虛擬化的 Linux 開發(fā)環(huán)境,Homestead 是一個不錯的選擇。
Valet 僅支持 Mac,并要求你將 PHP 和數(shù)據(jù)庫服務(wù)器直接安裝到本地機(jī)器上。這可以很容易地通過使用 Homebrew
命令來實現(xiàn),比如 brew install php
和 brew install mysql
。Valet 提供了一個極快的、資源消耗最少本地開發(fā)環(huán)境,非常適合只需要 PHP/MySQL 并且不需要虛擬開發(fā)環(huán)境的開發(fā)人員。
Valet 和 Homestead 都是配置 Laravel 開發(fā)環(huán)境的絕佳選擇。選擇哪一個僅僅取決于個人喜好和團(tuán)隊的需求。
安裝
Valet 需要 macOS 系統(tǒng)和 Homebrew。在安裝之前,要確保沒有其它程序(如 Apache 或 Nginx)占用了本地機(jī)器的 80 端口。
- 使用
brew update
將 Homebrew 安裝或更新到最新版本。 - 使用 Homebrew 的
brew install php
命令安裝 PHP 7.3。 - 安裝 Composer.
- 使用 Composer 的
composer global require laravel/valet
命令安裝 Valet。并確保~/.composer/vendor/bin
目錄在系統(tǒng)的 "PATH" 中。 - 運行
valet install
命令來配置和安裝 Valet 和 DnsMasq,并注冊 Valet 后臺服務(wù),隨系統(tǒng)運行自行啟動。
安裝完 Valet 后,可以嘗試使用類似 ping foobar.test
的命令在終端上 ping 任何一個 *.test
的域名。如果 Valet 安裝正確,可以在終端上看到來自 127.0.0.1
的響應(yīng)。
每次機(jī)器啟動時,Valet 會自動啟動其進(jìn)程。所以只要完成了 Valet 的初始化,就無需再次運行 valet start
或 valet install
。
使用其它域名
默認(rèn)情況下,Valet 使用 .test
頂級域名為你的項目提供服務(wù)。如果你想使用其它域名,可以使用 valet domain tld-name
命令。
例如,如果你想使用 .app
來代替 .test
,運行 valet domain app
,Valet 會自動將站點頂級域名改為 *.app
。
數(shù)據(jù)庫
如果你要使用數(shù)據(jù)庫,請在終端運行 brew install mysql@5.7
安裝 MySQL。一旦安裝完成,你可以使用 brew services start mysql
命令啟動 MySQL。然后,你可以使用 root
用戶名和空字符串密碼連接到 127.0.0.1
的數(shù)據(jù)庫。
PHP 版本
Valet 允許你使用 valet use php@version
命令來切換 PHP 版本。如果指定版本尚未安裝,Valet 將通過 Brew 來安裝指定的 PHP 版本:
valet use php@7.2valet use php
升級
你可以在終端使用 composer global update
命令來更新 Valet。升級后,如有需要,最好再次運行 valet install ,以便 Valet 對配置文件進(jìn)行升級。
升級到 Valet 2.0
Valet 2.0 將 Valet 底層的 Web 服務(wù)器從 Caddy 轉(zhuǎn)移到 Nginx。升級到此版本之前,你應(yīng)該運行以下命令停止并卸載現(xiàn)有的 Caddy 進(jìn)程:
valet stop valet uninstall
接下來,就根據(jù)你采用的安裝方式來升級 Valet (通常是通過 Git 或 Composer )。如果是通過 Composer 安裝了 Valet ,則應(yīng)使用以下命令更新到最新的主要版本:
composer global require laravel/valet
如果更新了 Valet 的源碼,你應(yīng)該執(zhí)行 install 命令:
valet install valet restart
升級過后,可能需要重新設(shè)置或重新鏈接你的站點。
服務(wù)站點
安裝了 Valet 之后,你就可以開始設(shè)置站點。Valet 提供兩個命令來為 Laravel 的站點提供服務(wù): park
和 link
。
- 運行
mkdir ~/Sites
命令在 Mac 上創(chuàng)建一個新的目錄。接下來,運行cd ~/Sites
和valet park
將當(dāng)前的工作目錄作為 Valet 搜索站點的路徑。 - 接下來,在這個目錄中創(chuàng)建一個新的 Laravel 站點:
laravel new blog
。 - 在瀏覽器中打開
http://blog.test
。
就這么多。 現(xiàn)在,你在 『parked』的目錄中創(chuàng)建的任何 Laravel 項目都將自動使用 http://folder-name.test
這種方式訪問。
如果要在目錄中提供單個站點而不是整個目錄,就使用 link 命令。
- 要使用該命令,先在終端里切換到你的某個項目并運行
valet link app-name
。Valet 會在~/.valet/Sites
中創(chuàng)建一個符號鏈接指向當(dāng)前的目錄。 - 運行
link
命令后,你可以在瀏覽器通過http://app-name.test
訪問站點。
運行 valet links
命令可以查看所有目錄鏈接的列表。你還可以使用 valet unlink app-name
來刪除符號鏈接。
{tip} 你可以使用
valet link
將多個(子)域名指向同一個應(yīng)用。要添加子域名或其它域名到應(yīng)用,可以在應(yīng)用目錄下運行valet link subdomain.app-name
。
默認(rèn)情況下,Valet 服務(wù)站點通過純 HTTP 的方式。但是,如果你想一個站點使用 HTTP/2 通過加密 TLS 提供服務(wù),使用 secure
命令。例如,如果你的站點通過 Valet 在 laravel.test
域上提供服務(wù),你應(yīng)當(dāng)運行如下的命令去保護(hù)它:
valet secure laravel
要一個站點『解除保護(hù)』并恢復(fù)為通過純 HTTP 提供服務(wù)它的流量,使用 unsecure
命令。與 secure
命令一樣,該命令接受你希望去解除保護(hù)的主機(jī)名稱:
valet unsecure laravel
共享站點
Valet 甚至包括與世界共享你的本地站點的命令。一旦安裝 Valet 后無需安裝其它軟件。
要共享站點,在終端中導(dǎo)航你的站點目錄并運行 valet share
命令。一個公開可訪問的 URL 將被插入到剪貼板中,并可以直接粘貼到你的瀏覽器中。僅此而已。
要停止共享你的站點,請按 Control + C
去取消該過程。
自定義 Valet 驅(qū)動
你可以編寫你自己的 Valet『驅(qū)動』來為 Valet 原本不支持的其它框架或 CMS 上運行的 PHP 應(yīng)用程序提供服務(wù)。當(dāng)你安裝 Valet 時,會創(chuàng)建一個包含 SampleValetDriver.php
文件的 ~/.config/valet/Drivers
目錄。該文件包含一個示例驅(qū)動程序?qū)崿F(xiàn),演示了如何編寫一個自定義的驅(qū)動程序。編寫驅(qū)動程序僅需要你去實現(xiàn)三個方法:serves
,isStaticFile
和 frontControllerPath
。
這三個方法都接受 $sitePath
,$siteName
和 $uri
值作為參數(shù)。$sitePath
是你的機(jī)器上提供站點的完全限定路徑。比如 /Users/Lisa/Sites/my-project
。$siteName
是域(my-project
)的『主機(jī)』/『站點名稱』部分。$uri
是即將到來的請求 URL(/foo/bar)。
一旦你完成你的自定義 Valet 驅(qū)動,使用 FrameworkValetDriver.php
命名約定將它放置在 ~/.config/valet/Drivers
目錄中。例如,如果你為 WordPress 編寫了一個自定義的 valet 驅(qū)動,你的文件名稱應(yīng)該是 WordPressValetDriver.php
。
我們來看看自定義的 Valet 驅(qū)動程序應(yīng)該實現(xiàn)的每種方法的示例實現(xiàn)。
serves
方法
如果你的驅(qū)動程序應(yīng)當(dāng)處理即將到來的請求時, serves
方法應(yīng)該返回 true
。否則,此方法應(yīng)當(dāng)返回 false
。因此,在此方法中,你應(yīng)該你企圖確定給定的 $sitePath
是否包含你嘗試提供的類型的項目。
例如,讓我們假裝正在編寫一個 WordPressValetDriver
。我們的 serves
方法可能看起來如下所示:
/** * 確定驅(qū)動程序是否滿足請求。 * * @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
應(yīng)當(dāng)確定即將到來的請求是否針對一個『靜態(tài)』文件,比如:圖片和樣式表。如果文件是靜態(tài)的,此方法應(yīng)當(dāng)返回靜態(tài)文件在磁盤上的完全限定路徑。如果即將到來的請求不是針對一個靜態(tài)文件,這個方法應(yīng)當(dāng)返回 false
:
/** * 確定即將到來的請求是否針對靜態(tài)文件。 * * @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
方法對即將到來的請求且請求 URI 不是/
返回true
時,才會調(diào)用isStaticFile
方法。
frontControllerPath
方法
frontControllerPath
方法應(yīng)當(dāng)返回你的應(yīng)用程序的『前端控制器』完全限定的路徑,它通常是你的 『index.php』文件或者等效的文件:
/** * 獲取對應(yīng)用程序的前端控制器的完全解析路徑。 * * @param string $sitePath * @param string $siteName * @param string $uri * @return string */ public function frontControllerPath($sitePath, $siteName, $uri){ return $sitePath.'/public/index.php'; }
本地驅(qū)動
如果你想為單個應(yīng)用程序自定義 Valet 驅(qū)動程序,在應(yīng)用程序的根目錄下創(chuàng)建一個 LocalValetDriver.php
文件。你的自定義驅(qū)動程序可以擴(kuò)展 ValetDriver
基類或者繼承一個現(xiàn)有的應(yīng)用程序的特定驅(qū)動程序,比如:LaravelValetDriver
:
class LocalValetDriver extends LaravelValetDriver{ /** * 確定驅(qū)動程序是否滿足請求。 * * @param string $sitePath * @param string $siteName * @param string $uri * @return bool */ public function serves($sitePath, $siteName, $uri){ return true; } /** * 獲取對應(yīng)用程序的前端控制器的完全解析路徑。 * * @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 | 從一個『駐留』目錄運行此命令,從駐留目錄列表將其它移除 |
valet paths | 查看所有『駐留』路徑 |
valet restart | 重啟 Valet 守護(hù)進(jìn)程 |
valet start | 開啟 Valet 守護(hù)進(jìn)程 |
valet stop | 停止 Valet 守護(hù)進(jìn)程 |
valet uninstall | 完成卸載 Valet 守護(hù)進(jìn)程 |