Skip to content
赞助商赞助商赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Valet

介绍

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

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

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

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

安装

NOTE

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

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

php
brew update

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

php
brew install php

安装 PHP 后,您可以安装 Composer 包管理器。此外,您应该确保 ~/.composer/vendor/bin 目录在系统的 "PATH" 中。安装 Composer 后,您可以将 Laravel Valet 作为全局 Composer 包安装:

php
composer global require laravel/valet

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

php
valet install

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

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

PHP 版本

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

php
valet use php@7.2

valet use php

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

php
php@7.2

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

NOTE

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

数据库

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

重置您的安装

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

升级 Valet

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

服务站点

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

"Park" 命令

"Park" 命令在您的机器上注册一个包含应用程序的目录。目录一旦被 Valet "parked",该目录中的所有目录都可以在您的浏览器中通过 http://<directory-name>.test 访问:

php
cd ~/Sites

valet park

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

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

php
cd ~/Sites/laravel

valet link

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

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

php
cd ~/Sites/laravel

valet link application

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

php
valet links

"Unlink" 命令可用于销毁站点的符号链接:

php
cd ~/Sites/laravel

valet unlink

使用 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 甚至包括一个命令来与世界共享您的本地站点,提供了一种简单的方法来在移动设备上测试您的站点或与团队成员和客户共享。

通过 Ngrok 共享站点

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

php
cd ~/Sites/laravel

valet share

要停止共享您的站点,您可以按 Control + C。使用 Ngrok 共享您的站点需要您创建一个 Ngrok 账户设置一个身份验证令牌

NOTE

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

通过 Expose 共享站点

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

php
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
<?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

bash
// 通过 HTTP 代理...
valet proxy elasticsearch http://127.0.0.1:9200

// 通过 TLS + HTTP/2 代理...
valet proxy elasticsearch http://127.0.0.1:9200 --secure

您可以使用 "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;
}

NOTE

只有当 "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从“parked”目录中运行此命令以将其从 parked 目录列表中删除。
valet log查看 Valet 服务写入的日志列表。
valet paths查看所有“parked”路径。
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 站点配置。这些文件在运行 installsecuretld 命令时重建。

~/.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 配置。