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