跳至内容

Laravel Valet

介绍

想在 macOS 或 Windows 上更轻松地开发 Laravel 应用程序吗?不妨试试Laravel Herd。Herd包含 Laravel 开发所需的一切,包括 Valet、PHP 和 Composer。

Laravel Valet是专为 macOS 极简主义者打造的开发环境。Laravel Valet 会将您的 Mac 配置为在计算机启动时始终在后台运行Nginx 。然后, Valet使用DnsMasq*.test代理域中的所有请求,使其指向您本地计算机上安装的网站。

换句话说,Valet 是一个速度超快的 Laravel 开发环境,仅占用大约 7 MB 的内存。Valet 并非SailHomestead的完全替代品,但如果您想要灵活的基础架构、极致的速度,或者在内存有限的机器上工作,Valet 是一个不错的选择。

开箱即用的 Valet 支持包括但不限于:

但是,您可以使用自己的自定义驱动程序扩展 Valet 。

安装

Valet 需要 macOS 和Homebrew。安装前,请确保没有其他程序(例如 Apache 或 Nginx)绑定到本地计算机的 80 端口。

首先,您需要使用以下update命令确保 Homebrew 是最新的:

1brew update

接下来,您应该使用 Homebrew 安装 PHP:

1brew install php

安装 PHP 后,即可安装Composer 包管理器。此外,请确保该$HOME/.composer/vendor/bin目录位于系统的 PATH 环境变量中。Composer 安装完成后,您可以将 Laravel Valet 安装为全局 Composer 包:

1composer global require laravel/valet

最后,您可以执行 Valet 的install命令。这将配置并安装 Valet 和 DnsMasq。此外,Valet 所依赖的守护进程将配置为在系统启动时启动:

1valet install

Valet 安装完成后,尝试*.test使用以下命令在终端上 ping 任意域名ping foobar.test。如果 Valet 安装正确,您应该会看到该域名在 上响应127.0.0.1

每次您的机器启动时,Valet 都会自动启动其所需的服务。

PHP 版本

isolate 您无需修改​​全局 PHP 版本,而是可以通过命令 指示 Valet 使用每个站点的 PHP 版本

Valet 允许你使用以下命令切换 PHP 版本valet use php@version。如果指定的 PHP 版本尚未安装,Valet 将通过 Homebrew 安装它:

1valet use php@8.2
2 
3valet use php

您也可以.valetrc在项目根目录中创建一个文件。该.valetrc文件应包含网站应使用的 PHP 版本:

1php=php@8.2

一旦创建了该文件,您就可以简单地执行该valet use命令,该命令将通过读取该文件来确定站点首选的 PHP 版本。

即使您安装了多个 PHP 版本,Valet 一次也只提供一个 PHP 版本。

数据库

如果您的应用程序需要数据库,请查看DBngin,它是一款免费的一体化数据库管理工具,包含 MySQL、PostgreSQL 和 Redis。安装 DBngin 后,您可以127.0.0.1使用root用户名和空字符串作为密码连接到数据库。

重置安装

如果您无法正确安装 Valet,请执行composer global require laravel/valet以下命令,然后执行valet install,这将重置您的安装并解决各种问题。在极少数情况下,可能需要执行 ,valet uninstall --force然后执行 ,以“硬重置”Valet valet install

升级代客服务

您可以通过在终端中执行以下命令来更新您的 Valet 安装composer global require laravel/valet。升级后,最好运行该valet install命令,以便 Valet 可以根据需要对您的配置文件进行额外升级。

升级至 Valet 4

如果您要从 Valet 3 升级到 Valet 4,请按照以下步骤正确升级您的 Valet 安装:

  • 如果您添加了.valetphprc文件来自定义网站的 PHP 版本,请将每个.valetphprc文件重命名为.valetrc。然后,将其添加php=到文件的现有内容之前.valetrc
  • 更新所有自定义驱动程序,使其与新驱动程序系统的命名空间、扩展名、类型Prompts和返回类型Prompts相匹配。您可以参考 Valet 的SampleValetDriver作为示例。
  • 如果您使用 PHP 7.1 - 7.4 来服务您的网站,请确保您仍然使用 Homebrew 安装 PHP 8.0 或更高版本,因为 Valet 将使用此版本(即使它不是您的主要链接版本)来运行它的一些脚本。

服务站点

Valet 安装完成后,您就可以开始为 Laravel 应用程序提供服务了。Valet 提供了两个命令来帮助您为应用程序提供服务:parklink​​ 。

命令park

park命令会在你的机器上注册一个包含应用程序的目录。一旦该目录被 Valet 停放,该目录中的所有目录都可以通过以下方式在浏览器中访问http://<directory-name>.test

1cd ~/Sites
2 
3valet park

就这些了。现在,您在“停放”目录中创建的任何应用程序都将自动按照http://<directory-name>.test约定提供服务。因此,如果您的停放目录中包含一个名为“laravel”的目录,则该目录中的应用程序将可以通过 访问http://laravel.test。此外,Valet 还自动允许您使用通配符子域名 ( http://foo.laravel.test) 访问该网站。

link命令也可用于服务你的 Laravel 应用程序。如果你希望服务目录中的单个站点而不是整个目录,则此命令非常有用:

1cd ~/Sites/laravel
2 
3valet link

使用 命令将应用程序链接到 Valet 后link,您就可以使用其目录名称访问该应用程序。因此,上面示例中链接的网站可以通过 访问http://laravel.test。此外,Valet 还自动允许您使用通配符子域名 ( http://foo.laravel.test) 访问该网站。

如果您希望在其他主机名上提供服务,可以将主机名传递给link命令。例如,您可以运行以下命令,使应用程序在以下位置可用http://application.test

1cd ~/Sites/laravel
2 
3valet link application

当然,您也可以使用以下link命令在子域上提供应用程序:

1valet link api.application

您可以执行该links命令来显示所有链接目录的列表:

1valet links

以下命令unlink可用于破坏站点的符号链接:

1cd ~/Sites/laravel
2 
3valet unlink

使用 TLS 保护站点

默认情况下,Valet 通过 HTTP 协议为网站提供服务。但是,如果您想使用 HTTP/2 协议通过加密的 TLS 协议为网站提供服务,可以使用以下secure命令。例如,如果您的网站由 Valet 在域名上提供服务laravel.test,则应运行以下命令来保护它:

1valet secure laravel

要“取消安全保护”某个网站并恢复通过纯 HTTP 服务其流量,请使用该unsecure命令。与该secure命令类似,此命令接受您要取消安全的主机名:

1valet unsecure laravel

提供默认站点

有时,您可能希望将 Valet 配置为404在访问未知test域名时使用“默认”站点,而不是默认站点。为此,您可以在配置文件default中添加一个选项~/.config/valet/config.json,其中包含要作为默认站点的站点路径:

1"default": "/Users/Sally/Sites/example-site",

每个站点的 PHP 版本

默认情况下,Valet 使用全局 PHP 安装来为您的网站提供服务。但是,如果您需要在不同的网站上支持多个 PHP 版本,您可以使用该isolate命令指定特定网站应使用的 PHP 版本。该isolate命令会将 Valet 配置为使用当前工作目录中的站点所指定的 PHP 版本:

1cd ~/Sites/example-site
2 
3valet isolate php@8.0

如果您的站点名称与包含它的目录的名称不匹配,您可以使用以下--site选项指定站点名称:

1valet isolate php@8.0 --site="site-name"

为了方便起见,您可以根据站点配置的 PHP 版本,使用valet phpcomposer和命令来代理对适当的 PHP CLI 或工具的调用:which-php

1valet php
2valet composer
3valet which-php

您可以执行该isolated命令来显示所有隔离站点及其 PHP 版本的列表:

1valet isolated

要将站点恢复到 Valet 全局安装的 PHP 版本,您可以unisolate从站点的根目录调用以下命令:

1valet unisolate

共享网站

Valet 包含一个与世界共享您的本地站点的命令,提供了一种在移动设备上测试您的站点或与团队成员和客户共享的简便方法。

Valet 开箱即用,支持通过 ngrok 或 Expose 共享你的网站。在共享网站之前,你应该使用以下share-tool命令更新你的 Valet 配置,并指定ngrokexposecloudflared

1valet share-tool ngrok

如果您选择了一个工具,但尚未通过 Homebrew(用于 ngrok 和 cloudflared)或 Composer(用于 Expose)安装,Valet 会自动Prompts您安装。当然,这两个工具都要求您先验证您的 ngrok 或 Expose 帐户,然后才能开始共享网站。

要共享站点,请在终端中导航到站点目录并运行 Valetshare命令。一个可公开访问的 URL 将被放入您的剪贴板,您可以直接粘贴到浏览器中或与您的团队共享:

1cd ~/Sites/laravel
2 
3valet share

要停止共享您的网站,您可以按Control + C

如果您使用的是自定义 DNS 服务器(例如1.1.1.1),ngrok 共享可能无法正常工作。如果您的机器出现这种情况,请打开 Mac 的系统设置,前往“网络”设置,打开“高级”设置,然后前往“DNS”选项卡并将其添加127.0.0.1为您的第一个 DNS 服务器。

通过 Ngrok 共享网站

使用 ngrok 共享你的网站需要你创建一个 ngrok 帐户设置一个身份验证令牌。一旦你有了身份验证令牌,你就可以用它更新你的 Valet 配置:

1valet set-ngrok-token YOUR_TOKEN_HERE

您可以将其他 ngrok 参数传递给 share 命令,例如valet share --region=eu。有关更多信息,请参阅ngrok 文档

通过 Expose 分享网站

使用 Expose 共享您的网站需要您创建一个 Expose 帐户通过您的身份验证令牌向 Expose 进行身份验证

您可以查阅Expose 文档以获取有关其支持的其他命令行参数的信息。

在本地网络上共享网站

Valet 默认将传入流量限制到内部127.0.0.1接口,以便您的开发机器不会受到来自互联网的安全风险。

如果您希望允许本地网络上的其他设备通过您的 IP 地址(例如: )访问您机器上的 Valet 网站192.168.1.10/application.test,则需要手动编辑该网站的相应 Nginx 配置文件,以删除该listen指令的限制。您应该删除127.0.0.1:该指令中listen针对端口 80 和 443 的前缀。

如果您尚未valet secure在项目上运行,则可以通过编辑该文件为所有非 HTTPS 站点开放网络访问/usr/local/etc/nginx/valet/valet.conf。但是,如果您通过 HTTPS 为项目站点提供服务(您已valet secure在站点上运行),则需要编辑该~/.config/valet/Nginx/app-name.test文件。

更新 Nginx 配置后,运行valet restart命令以应用配置更改。

站点特定环境变量

一些使用其他框架的应用程序可能依赖于服务器环境变量,但没有提供在项目中配置这些变量的方法。Valet 允许你通过.valet-env.php在项目根目录下添加一个文件来配置特定于站点的环境变量。该文件应返回一个站点 / 环境变量对的数组,这些数组将被添加到$_SERVER数组中指定的每个站点的全局数组中:

1<?php
2 
3return [
4 // Set $_SERVER['key'] to "value" for the laravel.test site...
5 'laravel' => [
6 'key' => 'value',
7 ],
8 
9 // Set $_SERVER['key'] to "value" for all sites...
10 '*' => [
11 'key' => 'value',
12 ],
13];

代理服务

有时您可能希望将 Valet 域名代理到本地计算机上的其他服务。例如,您可能偶尔需要在运行 Valet 的同时在 Docker 中运行一个单独的站点;但是,Valet 和 Docker 不能同时绑定到 80 端口。

为了解决这个问题,您可以使用proxy以下命令生成代理。例如,您可以代理从http://elasticsearch.test到 的所有流量http://127.0.0.1:9200

1# Proxy over HTTP...
2valet proxy elasticsearch http://127.0.0.1:9200
3 
4# Proxy over TLS + HTTP/2...
5valet proxy elasticsearch http://127.0.0.1:9200 --secure

您可以使用以下命令删除代理unproxy

1valet unproxy elasticsearch

您可以使用以下proxies命令列出所有代理的站点配置:

1valet proxies

定制代客司机

您可以编写自己的 Valet “驱动程序”,用于服务于 Valet 本身不支持的框架或 CMS 上运行的 PHP 应用程序。安装 Valet 时,~/.config/valet/Drivers会创建一个包含SampleValetDriver.php文件的目录。该文件包含一个示例驱动程序实现,用于演示如何编写自定义驱动程序。编写驱动程序只需要实现三个方法:servesisStaticFilefrontControllerPath

这三种方法均接收$sitePath$siteName$uri值作为参数。$sitePath是您计算机上所提供服务的站点的完整限定路径,例如/Users/Lisa/Sites/my-project$siteName是域名的“主机”/“站点名称”部分 ( my-project)。$uri是传入请求的 URI ( /foo/bar)。

完成自定义 Valet 驱动程序后,请~/.config/valet/Drivers按照FrameworkValetDriver.php命名约定将其放入目录中。例如,如果您正在为 WordPress 编写自定义 Valet 驱动程序,则文件名应为WordPressValetDriver.php

让我们看一下自定义 Valet 驱动程序应实现的每种方法的示例实现。

方法serves

如果您的驱动程序需要处理传入的请求,则serves方法应该返回。否则,该方法应该返回。因此,在此方法中,您应该尝试判断给定的 是否包含您尝试服务的类型的项目。truefalse$sitePath

例如,假设我们正在编写一个WordPressValetDriver。我们的serves方法可能看起来像这样:

1/**
2 * Determine if the driver serves the request.
3 */
4public function serves(string $sitePath, string $siteName, string $uri): bool
5{
6 return is_dir($sitePath.'/wp-admin');
7}

方法isStaticFile

该方法isStaticFile应该判断传入的请求是否是“静态”文件,例如图片或样式表。如果文件是静态的,则该方法应该返回该静态文件在磁盘上的完全限定路径。如果传入的请求不是静态文件,则该方法应该返回false

1/**
2 * Determine if the incoming request is for a static file.
3 *
4 * @return string|false
5 */
6public function isStaticFile(string $sitePath, string $siteName, string $uri)
7{
8 if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
9 return $staticFilePath;
10 }
11 
12 return false;
13}

仅当该方法针对传入请求返回并且请求 URI 不是时,isStaticFile才会调用 该方法servestrue/

方法frontControllerPath

frontControllerPath方法应返响应用程序“前端控制器”的完整限定路径,该路径通常为“index.php”文件或等效文件:

1/**
2 * Get the fully resolved path to the application's front controller.
3 */
4public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
5{
6 return $sitePath.'/public/index.php';
7}

本地司机

如果您想为单个应用程序定义自定义 Valet 驱动程序,请LocalValetDriver.php在应用程序的根目录中创建一个文件。您的自定义驱动程序可以扩展基ValetDriver类,也可以扩展现有的特定于应用程序的驱动程序,例如LaravelValetDriver

1use Valet\Drivers\LaravelValetDriver;
2 
3class LocalValetDriver extends LaravelValetDriver
4{
5 /**
6 * Determine if the driver serves the request.
7 */
8 public function serves(string $sitePath, string $siteName, string $uri): bool
9 {
10 return true;
11 }
12 
13 /**
14 * Get the fully resolved path to the application's front controller.
15 */
16 public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
17 {
18 return $sitePath.'/public_html/index.php';
19 }
20}

其他 Valet 命令

命令 描述
valet list 显示所有 Valet 命令的列表。
valet diagnose 输出诊断以帮助调试 Valet。
valet directory-listing 确定目录列表行为。默认值为“关闭”,即为目录呈现 404 页面。
valet forget 从“停放”目录运行此命令以将其从停放目录列表中删除。
valet log 查看 Valet 服务写入的日志列表。
valet paths 查看所有“停放”的路径。
valet restart 重新启动 Valet 守护进程。
valet start 启动 Valet 守护进程。
valet stop 停止 Valet 守护进程。
valet trust 为 Brew 和 Valet 添加 sudoers 文件,以允许运行 Valet 命令而无需Prompts输入密码。
valet uninstall 卸载 Valet:显示手动卸载的说明。选择此--force选项即可彻底删除 Valet 的所有资源。

Valet 目录和文件

在解决 Valet 环境问题时,您可能会发现以下目录和文件信息很有帮助:

~/.config/valet

包含 Valet 的所有配置。您可能希望保留此目录的备份。

~/.config/valet/dnsmasq.d/

该目录包含DNSMasq的配置。

~/.config/valet/Drivers/

此目录包含 Valet 的驱动程序。驱动程序决定了特定框架/CMS 的运行方式。

~/.config/valet/Nginx/

此目录包含 Valet 的所有 Nginx 站点配置。运行installsecure命令时会重建这些文件。

~/.config/valet/Sites/

该目录包含链接项目的所有符号链接

~/.config/valet/config.json

该文件是 Valet 的主配置文件。

~/.config/valet/valet.sock

该文件是 Valet 的 Nginx 安装所使用的 PHP-FPM 套接字。仅当 PHP 正常运行时,它才会存在。

~/.config/valet/Log/fpm-php.www.log

该文件是 PHP 错误的用户日志。

~/.config/valet/Log/nginx-error.log

该文件是 Nginx 错误的用户日志。

/usr/local/var/log/php-fpm.log

该文件是 PHP-FPM 错误的系统日志。

/usr/local/var/log/nginx

该目录包含 Nginx 访问和错误日​​志。

/usr/local/etc/php/X.X/conf.d

该目录包含*.ini各种 PHP 配置设置的文件。

/usr/local/etc/php/X.X/php-fpm.d/valet-fpm.conf

该文件是 PHP-FPM 池配置文件。

~/.composer/vendor/laravel/valet/cli/stubs/secure.valet.conf

该文件是用于为您的网站构建 SSL 证书的默认 Nginx 配置。

磁盘访问

自 macOS 10.14 起,部分文件和目录的访问默认受到限制。这些限制包括“桌面”、“文档”和“下载”目录。此外,网络卷和可移动卷的访问也受到限制。因此,Valet 建议您将站点文件夹放置在这些受保护位置之外。

但是,如果您希望从这些位置之一访问网站,则需要授予 Nginx“完全磁盘访问权限”。否则,您可能会遇到服务器错误或其他 Nginx 不可预测的行为,尤其是在提供静态资源时。通常,macOS 会自动Prompts您授予 Nginx 对这些位置的完全访问权限。或者,您也可以通过System Preferences> Security & Privacy>Privacy并选择手动授予访问权限Full Disk Access。接下来,nginx在主窗口窗格中启用所有条目。