Skip to content

Laravel Valet

介绍

Valet 是为 Mac 极简主义者设计的 Laravel 开发环境。无需 Vagrant,无需 /etc/hosts 文件。您甚至可以使用本地隧道公开共享您的站点。是的,我们也喜欢它。

Laravel Valet 配置您的 Mac 以在机器启动时始终在后台运行 Nginx。然后,使用 DnsMasq,Valet 将所有 *.test 域的请求代理到安装在本地机器上的站点。

换句话说,这是一个超快的 Laravel 开发环境,仅使用大约 7 MB 的 RAM。Valet 不是 Vagrant 或 Homestead 的完全替代品,但如果您想要灵活的基础功能、偏爱极快的速度或在内存有限的机器上工作,它是一个很好的选择。

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

然而,您可以通过自己的自定义驱动扩展 Valet。

Valet 或 Homestead

如您所知,Laravel 提供了 Homestead,另一个本地 Laravel 开发环境。Homestead 和 Valet 在其目标受众和本地开发方法上有所不同。Homestead 提供了一个完整的 Ubuntu 虚拟机,具有自动化的 Nginx 配置。如果您想要一个完全虚拟化的 Linux 开发环境或在 Windows / Linux 上工作,Homestead 是一个很好的选择。

Valet 仅支持 Mac,并要求您将 PHP 和数据库服务器直接安装到本地机器上。这可以通过使用 Homebrew 轻松实现,使用诸如 brew install phpbrew install mysql 之类的命令。Valet 提供了一个超快的本地开发环境,资源消耗极少,因此对于只需要 PHP / MySQL 而不需要完全虚拟化开发环境的开发人员来说是一个很好的选择。

Valet 和 Homestead 都是配置您的 Laravel 开发环境的绝佳选择。您选择哪一个将取决于您的个人品味和团队的需求。

安装

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

  • 使用 brew update 安装或更新 Homebrew 到最新版本。
  • 使用 Homebrew 安装 PHP 7.4,命令为 brew install php
  • 安装 Composer
  • 使用 Composer 安装 Valet,命令为 composer global require laravel/valet。确保 ~/.composer/vendor/bin 目录在您的系统 "PATH" 中。
  • 运行 valet install 命令。这将配置并安装 Valet 和 DnsMasq,并注册 Valet 的守护程序以在系统启动时启动。

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

Valet 将在每次机器启动时自动启动其守护程序。安装完成后,无需再次运行 valet startvalet install

使用其他域

默认情况下,Valet 使用 .test TLD 服务您的项目。如果您想使用其他域,可以使用 valet tld tld-name 命令。

例如,如果您想使用 .app 而不是 .test,请运行 valet tld app,Valet 将自动开始在 *.app 上服务您的项目。

数据库

如果您需要数据库,请尝试通过在命令行中运行 brew install mysql@5.7 来安装 MySQL。安装 MySQL 后,您可以使用 brew services start mysql@5.7 命令启动它。然后,您可以使用 root 用户名和空字符串作为密码连接到数据库 127.0.0.1

PHP 版本

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

php
valet use php@7.2

valet use php
exclamation

Valet 仅同时服务一个 PHP 版本,即使您安装了多个 PHP 版本。

重置安装

如果您在运行 Valet 安装时遇到问题,执行 composer global update 命令,然后执行 valet install 将重置您的安装,并可以解决各种问题。在极少数情况下,可能需要通过执行 valet uninstall --force 然后执行 valet install 来“硬重置” Valet。

升级

您可以在终端中使用 composer global update 命令更新您的 Valet 安装。升级后,最好运行 valet install 命令,以便 Valet 可以在必要时对您的配置文件进行额外升级。

服务站点

一旦 Valet 安装完成,您就可以开始服务站点了。Valet 提供了两个命令来帮助您服务您的 Laravel 站点:parklink

"Park" 命令

  • 通过运行 mkdir ~/Sites 在您的 Mac 上创建一个新目录。接下来,cd ~/Sites 并运行 valet park。此命令将注册您的当前工作目录为 Valet 应该搜索站点的路径。
  • 接下来,在此目录中创建一个新的 Laravel 站点:laravel new blog
  • 在浏览器中打开 http://blog.test

就是这么简单。 现在,您在“停放”目录中创建的任何 Laravel 项目都将自动使用 http://folder-name.test 约定进行服务。

"Link" 命令也可以用来服务您的 Laravel 站点。如果您想在目录中服务单个站点而不是整个目录,此命令非常有用。

  • 要使用此命令,请导航到您的项目之一并在终端中运行 valet link app-name。Valet 将在 ~/.config/valet/Sites 中创建一个指向您当前工作目录的符号链接。
  • 运行 link 命令后,您可以在浏览器中访问 http://app-name.test 站点。

要查看所有链接目录的列表,请运行 valet links 命令。您可以使用 valet unlink app-name 来销毁符号链接。

lightbulb

您可以使用 valet link 从多个(子)域服务同一个项目。要为您的项目添加子域或其他域,请从项目文件夹运行 valet link subdomain.app-name

使用 TLS 保护站点

默认情况下,Valet 通过普通 HTTP 服务站点。但是,如果您想通过加密的 TLS 使用 HTTP/2 服务站点,请使用 secure 命令。例如,如果您的站点由 Valet 在 laravel.test 域上服务,您应该运行以下命令来保护它:

php
valet secure laravel

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

php
valet unsecure laravel

服务默认站点

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

php
"default": "/Users/Sally/Sites/foo",

共享站点

Valet 甚至包括一个命令,可以与世界共享您的本地站点,提供了一种简单的方法来在移动设备上测试您的站点或与团队成员和客户共享。安装 Valet 后,无需额外的软件安装。

通过 Ngrok 共享站点

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

要停止共享您的站点,请按 Control + C 取消该过程。

lightbulb

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

通过 Expose 共享站点

如果您安装了 Expose,您可以通过在终端中导航到站点的目录并运行 expose 命令来共享您的站点。请查阅 expose 文档以获取其支持的其他命令行参数。共享站点后,Expose 将显示可共享的 URL,您可以在其他设备上使用或在团队成员之间使用。

要停止共享您的站点,请按 Control + C 取消该过程。

在本地网络上共享站点

Valet 默认将传入流量限制为内部 127.0.0.1 接口。这样,您的开发机器不会暴露于来自互联网的安全风险。

如果您希望允许本地网络上的其他设备通过您的机器的 IP 地址(例如:192.168.1.10/app-name.test)访问您机器上的 Valet 站点,您需要手动编辑该站点的适当 Nginx 配置文件,以通过删除端口 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
<?php

// 为 foo.test 站点设置 $_SERVER['key'] 为 "value"...
return [
    'foo' => [
        'key' => 'value',
    ],
];

// 为所有站点设置 $_SERVER['key'] 为 "value"...
return [
    '*' => [
        'key' => 'value',
    ],
];

代理服务

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

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

php
valet proxy elasticsearch http://127.0.0.1:9200

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

php
valet unproxy elasticsearch

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

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

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

serves 方法

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

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

php
/**
 * 确定驱动是否服务请求。
 *
 * @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

php
/**
 * 确定传入请求是否为静态文件。
 *
 * @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;
}
exclamation

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

frontControllerPath 方法

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

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

php
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 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 驱动。
~/.config/valet/Extensions/包含自定义 Valet 扩展/命令。
~/.config/valet/Nginx/包含所有 Valet 生成的 Nginx 站点配置。这些文件在运行 installsecuretld 命令时重建。
~/.config/valet/Sites/包含所有链接项目的符号链接。
~/.config/valet/config.jsonValet 的主配置文件
~/.config/valet/valet.sockValet 的 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.confPHP-FPM 池配置文件。
~/.composer/vendor/laravel/valet/cli/stubs/secure.valet.conf用于构建站点证书的默认 Nginx 配置。