跳到内容

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 的完整替代品,但如果你想要灵活的基础知识,偏爱极快的速度,或者正在使用内存有限的机器,它是一个很好的替代方案。

开箱即用,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 版本。如果尚未安装,Valet 将通过 Homebrew 安装指定的 PHP 版本

 
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 uninstall --force,然后执行 valet install 来“硬重置”Valet。

升级 Valet

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

升级到 Valet 4

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

  • 如果你添加了 .valetphprc 文件来定制你站点的 PHP 版本,请将每个 .valetphprc 文件重命名为 .valetrc。然后,将 php= 添加到 .valetrc 文件的现有内容的前面。
  • 更新所有自定义驱动程序,以匹配新驱动程序系统的命名空间、扩展名、类型提示和返回类型提示。你可以参考 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 命令。例如,如果您的站点由 Valet 在 laravel.test 域名上提供服务,则应运行以下命令来保护它:

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 接口,以避免您的开发机器暴露于来自 Internet 的安全风险。

如果您希望允许本地网络上的其他设备通过您机器的 IP 地址(例如:192.168.1.10/application.test)访问您机器上的 Valet 站点,则需要手动编辑该站点的相应 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 域名代理到本地计算机上的另一个服务。例如,您可能偶尔需要在运行 Valet 的同时在 Docker 中运行单独的站点;但是,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 确定目录列表行为。默认值为“off”,它会为目录呈现 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 条目。