跳至内容

Laravel Valet

简介

lightbulb

正在寻找在 macOS 或 Windows 上开发 Laravel 应用程序的更简单方法?请查看 Laravel Herd。Herd 包括开始 Laravel 开发所需的一切,包括 Valet、PHP 和 Composer。

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

换句话说,Valet 是一个极速的 Laravel 开发环境,大约使用 7 MB 的 RAM。Valet 并不是 SailHomestead 的完整替代品,但如果您想要灵活的基础、偏好极速或在 RAM 有限的机器上工作,它提供了一个很好的替代方案。

Valet 默认支持以下内容,但不限于:

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

安装

exclamation

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

要开始使用,您首先需要使用 update 命令确保 Homebrew 已更新

brew update

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

brew install php

安装 PHP 后,您就可以安装 Composer 包管理器。此外,您应该确保 $HOME/.composer/vendor/bin 目录位于系统的“PATH”中。安装 Composer 后,您可以将 Laravel Valet 作为全局 Composer 包安装

composer global require laravel/valet

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

valet install

安装 Valet 后,尝试使用诸如 ping foobar.test 之类的命令在您的终端中 ping 任何 *.test 域名。如果 Valet 正确安装,您应该会看到此域名在 127.0.0.1 上响应。

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

PHP 版本

lightbulb

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

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

 
valet use php

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

php=php@8.2

创建此文件后,您只需执行 valet use 命令,该命令将通过读取文件来确定站点的首选 PHP 版本。

exclamation

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

数据库

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

重置您的安装

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

升级 Valet

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

升级到 Valet 4

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

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

提供站点服务

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

park 命令

park 命令在您的机器上注册一个包含应用程序的目录。将目录与 Valet “停放”后,该目录中的所有目录都可以在您的 Web 浏览器中通过 http://<directory-name>.test 访问

cd ~/Sites
 
valet park

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

link 命令也可用于为 Laravel 应用程序提供服务。如果您想在目录中提供单个站点的服务而不是整个目录的服务,此命令非常有用

cd ~/Sites/laravel
 
valet link

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

如果您想在不同的主机名上提供应用程序的服务,则可以将主机名传递给 link 命令。例如,您可以运行以下命令以使应用程序在 http://application.test 上可用

cd ~/Sites/laravel
 
valet link application

当然,您也可以使用link命令在子域名上提供应用程序服务。

valet link api.application

您可以执行links命令以显示所有已链接目录的列表。

valet links

unlink命令可用于销毁站点的符号链接。

cd ~/Sites/laravel
 
valet unlink

使用 TLS 保护站点

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

valet secure laravel

要“取消保护”站点并恢复为通过普通 HTTP 提供其流量,请使用unsecure命令。与secure命令一样,此命令接受您希望取消保护的主机名。

valet unsecure laravel

提供默认站点服务

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

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

每个站点的 PHP 版本

默认情况下,Valet 使用您的全局 PHP 安装来提供您的站点服务。但是,如果您需要跨各种站点支持多个 PHP 版本,则可以使用isolate命令指定特定站点应使用哪个 PHP 版本。isolate命令配置 Valet 使用指定的 PHP 版本为当前工作目录中的站点提供服务。

cd ~/Sites/example-site
 
valet isolate [email protected]

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

valet isolate [email protected] --site="site-name"

为了方便起见,您可以使用valet phpcomposerwhich-php命令将调用代理到基于站点的已配置 PHP 版本的相应 PHP CLI 或工具。

valet php
valet composer
valet which-php

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

valet isolated

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

valet unisolate

共享站点

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

Valet 默认支持通过 ngrok 或 Expose 共享您的站点。在共享站点之前,您应该使用share-tool命令更新您的 Valet 配置,指定ngrokexpose

valet share-tool ngrok

如果您选择了一个工具并且没有通过 Homebrew(对于 ngrok)或 Composer(对于 Expose)安装它,Valet 会自动提示您安装它。当然,这两个工具都需要您在开始共享站点之前对您的 ngrok 或 Expose 帐户进行身份验证。

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

cd ~/Sites/laravel
 
valet share

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

exclamation

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

通过 Ngrok 共享站点

使用 ngrok 共享您的站点需要您创建一个 ngrok 帐户设置身份验证令牌。拥有身份验证令牌后,您可以使用该令牌更新您的 Valet 配置。

valet set-ngrok-token YOUR_TOKEN_HERE
lightbulb

您可以将其他 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指令的限制。您应该删除端口 80 和 443 上listen指令的127.0.0.1:前缀。

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

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

特定于站点的环境变量

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

<?php
 
return [
// Set $_SERVER['key'] to "value" for the laravel.test site...
'laravel' => [
'key' => 'value',
],
 
// Set $_SERVER['key'] to "value" for all sites...
'*' => [
'key' => 'value',
],
];

代理服务

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

要解决此问题,您可以使用proxy命令生成代理。例如,您可以将来自http://elasticsearch.test的所有流量代理到http://127.0.0.1:9200

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

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

valet unproxy elasticsearch

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

valet proxies

自定义 Valet 驱动程序

您可以编写自己的 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 驱动程序后,使用FrameworkValetDriver.php命名约定将其放置在~/.config/valet/Drivers目录中。例如,如果您正在为 WordPress 编写自定义 valet 驱动程序,则您的文件名应为WordPressValetDriver.php

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

serves方法

serves方法如果您的驱动程序应该处理传入请求,则应返回true。否则,该方法应返回false。因此,在此方法中,您应该尝试确定给定的$sitePath是否包含您尝试提供的类型的项目。

例如,假设我们正在编写一个WordPressValetDriver。我们的serves方法可能如下所示。

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

isStaticFile方法

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

/**
* Determine if the incoming request is for a static file.
*
* @return string|false
*/
public function isStaticFile(string $sitePath, string $siteName, string $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
return $staticFilePath;
}
 
return false;
}
exclamation

只有当serves方法对传入请求返回true并且请求 URI 不是/时,才会调用isStaticFile方法。

frontControllerPath方法

frontControllerPath方法应返回应用程序“前端控制器”的完全限定路径,这通常是“index.php”文件或等效文件。

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

本地驱动程序

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

use Valet\Drivers\LaravelValetDriver;
 
class LocalValetDriver extends LaravelValetDriver
{
/**
* Determine if the driver serves the request.
*/
public function serves(string $sitePath, string $siteName, string $uri): bool
{
return true;
}
 
/**
* Get the fully resolved path to the application's front controller.
*/
public function frontControllerPath(string $sitePath, string $siteName, string $uri): string
{
return $sitePath.'/public_html/index.php';
}
}

其他 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 命令。
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

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

/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 会自动提示您授予 Nginx 对这些位置的完全访问权限。或者,您可以通过 系统偏好设置 > 安全性与隐私 > 隐私 手动执行此操作,并选择 完全磁盘访问权限。接下来,在主窗口窗格中启用任何 nginx 条目。