Laravel Valet
介绍
Laravel Valet 是为 macOS 极简主义者设计的开发环境。Laravel Valet 配置您的 Mac 以便在机器启动时始终在后台运行 Nginx。然后,使用 DnsMasq,Valet 将所有 *.test
域的请求代理到安装在本地机器上的站点。
换句话说,Valet 是一个超快的 Laravel 开发环境,使用大约 7 MB 的 RAM。Valet 不是 Sail 或 Homestead 的完整替代品,但如果您想要灵活的基础设施、偏爱极快的速度或在内存有限的机器上工作,它是一个很好的选择。
开箱即用,Valet 支持包括但不限于:
然而,您可以通过自己的自定义驱动扩展 Valet。
安装
Valet 需要 macOS 和 Homebrew。在安装之前,您应该确保没有其他程序如 Apache 或 Nginx 绑定到本地机器的端口 80。
要开始,您首先需要确保 Homebrew 使用 update
命令是最新的:
brew update
接下来,您应该使用 Homebrew 安装 PHP:
brew install php
安装 PHP 后,您可以安装 Composer 包管理器。此外,您应该确保 ~/.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 版本
Valet 允许您使用 valet use php@version
命令切换 PHP 版本。如果指定的 PHP 版本尚未安装,Valet 将通过 Homebrew 安装:
valet use php@7.2
valet use php
您还可以在项目的根目录中创建一个 .valetphprc
文件。.valetphprc
文件应包含站点应使用的 PHP 版本:
php@7.2
创建此文件后,您只需执行 valet use
命令,命令将通过读取文件来确定站点的首选 PHP 版本。
Valet 仅同时服务一个 PHP 版本,即使您安装了多个 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 后,您就可以开始服务您的 Laravel 应用了。Valet 提供了两个命令来帮助您服务您的应用:park
和 link
。
"Park" 命令
park
命令注册您机器上的一个目录,其中包含您的应用。一旦该目录被 Valet "park" 了,该目录中的所有目录都可以在您的浏览器中通过 http://<directory-name>.test
访问:
cd ~/Sites
valet park
就是这么简单。现在,您在“park”目录中创建的任何应用都将自动使用 http://<directory-name>.test
约定进行服务。因此,如果您的“park”目录包含一个名为“laravel”的目录,则该目录中的应用可以通过 http://laravel.test
访问。此外,Valet 自动允许您使用通配符子域访问站点(http://foo.laravel.test
)。
"Link" 命令
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 服务站点。然而,如果您希望通过加密的 TLS 使用 HTTP/2 服务站点,可以使用 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 php@8.0
如果您的站点名称与包含它的目录名称不匹配,可以使用 --site
选项指定站点名称:
valet isolate php@8.0 --site="site-name"
为了方便起见,您可以使用 valet php
、composer
和 which-php
命令根据站点配置的 PHP 版本代理调用适当的 PHP CLI 或工具:
valet php
valet composer
valet which-php
您可以执行 isolated
命令来显示所有隔离站点及其 PHP 版本的列表:
valet isolated
要将站点恢复到 Valet 的全局安装 PHP 版本,可以从站点的根目录调用 unisolate
命令:
valet unisolate
共享站点
Valet 甚至包括一个命令来与世界共享您的本地站点,提供了一种简单的方法来在移动设备上测试您的站点或与团队成员和客户共享。
通过 Ngrok 共享站点
要共享站点,请在终端中导航到站点的目录并运行 Valet 的 share
命令。一个可公开访问的 URL 将被插入到您的剪贴板中,并准备好直接粘贴到浏览器中或与您的团队共享:
cd ~/Sites/laravel
valet share
要停止共享您的站点,可以按 Control + C
。使用 Ngrok 共享站点需要您创建一个 Ngrok 账户并设置一个身份验证令牌。
您可以将额外的 Ngrok 参数传递给 share 命令,例如 valet share --region=eu
。有关更多信息,请查阅 ngrok 文档。
通过 Expose 共享站点
如果您安装了 Expose,可以通过在终端中导航到站点的目录并运行 expose
命令来共享您的站点。有关其支持的其他命令行参数的信息,请查阅 Expose 文档。共享站点后,Expose 将显示可共享的 URL,您可以在其他设备上使用或在团队成员之间共享:
cd ~/Sites/laravel
expose
要停止共享您的站点,可以按 Control + C
。
在本地网络上共享站点
Valet 默认将传入流量限制到内部 127.0.0.1
接口,以便您的开发机器不暴露于来自互联网的安全风险。
如果您希望允许本地网络上的其他设备通过您的机器的 IP 地址(例如:192.168.1.10/application.test
)访问 Valet 站点,您需要手动编辑该站点的适当 Nginx 配置文件以删除 listen
指令上的限制。您应该删除端口 80 和 443 的 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 [
// 为 laravel.test 站点设置 $_SERVER['key'] 为 "value"...
'laravel' => [
'key' => 'value',
],
// 为所有站点设置 $_SERVER['key'] 为 "value"...
'*' => [
'key' => 'value',
],
];
代理服务
有时您可能希望将 Valet 域代理到本地机器上的另一个服务。例如,您可能偶尔需要在运行 Valet 的同时运行一个单独的 Docker 站点;然而,Valet 和 Docker 不能同时绑定到端口 80。
为了解决这个问题,您可以使用 proxy
命令生成代理。例如,您可以将所有来自 http://elasticsearch.test
的流量代理到 http://127.0.0.1:9200
:
# 通过 HTTP 代理...
valet proxy elasticsearch http://127.0.0.1:9200
# 通过 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
文件。此文件包含一个示例驱动实现,以演示如何编写自定义驱动。编写驱动只需实现三个方法:serves
、isStaticFile
和 frontControllerPath
。
所有三个方法都接收 $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
方法应返回 true
,如果您的驱动应处理传入请求。否则,该方法应返回 false
。因此,在此方法中,您应尝试确定给定的 $sitePath
是否包含您尝试服务的项目类型。
例如,假设我们正在编写一个 WordPressValetDriver
。我们的 serves
方法可能看起来像这样:
/**
* 确定驱动是否服务请求。
*
* @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
应确定传入请求是否为“静态”文件,例如图像或样式表。如果文件是静态的,该方法应返回磁盘上静态文件的完全限定路径。如果传入请求不是静态文件,该方法应返回 false
:
/**
* 确定传入请求是否为静态文件。
*
* @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;
}
仅当 serves
方法对传入请求返回 true
且请求 URI 不是 /
时,才会调用 isStaticFile
方法。
frontControllerPath
方法
frontControllerPath
方法应返回应用程序“前端控制器”的完全解析路径,通常是“index.php”文件或等效文件:
/**
* 获取应用程序前端控制器的完全解析路径。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public/index.php';
}
本地驱动
如果您希望为单个应用定义自定义 Valet 驱动,请在应用的根目录中创建一个 LocalValetDriver.php
文件。您的自定义驱动可以扩展基础 ValetDriver
类或扩展现有的应用特定驱动,例如 LaravelValetDriver
:
use Valet\Drivers\LaravelValetDriver;
class LocalValetDriver extends LaravelValetDriver
{
/**
* 确定驱动是否服务请求。
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return true;
}
/**
* 获取应用程序前端控制器的完全解析路径。
*
* @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 list | 显示所有 Valet 命令的列表。 |
valet forget | 从“park”目录中运行此命令以将其从“park”目录列表中移除。 |
valet log | 查看 Valet 服务写入的日志列表。 |
valet paths | 查看所有“park”路径。 |
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/Extensions/
此目录包含自定义 Valet 扩展/命令。
~/.config/valet/Nginx/
此目录包含所有 Valet 的 Nginx 站点配置。这些文件在运行 install
和 secure
命令时重建。
~/.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
条目。