Skip to content

Laravel Valet

介绍

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

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

换句话说,这是一个超快的 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 php71brew install mariadb 之类的命令。Valet 提供了一个超快的本地开发环境,资源消耗极少,因此对于只需要 PHP / MySQL 而不需要完全虚拟化开发环境的开发人员来说,它是一个很好的选择。

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

安装

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

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

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

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

使用其他域

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

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

数据库

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

升级

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

升级到 Valet 2.0

Valet 2.0 将 Valet 的底层 Web 服务器从 Caddy 过渡到 Nginx。在升级到此版本之前,您应该运行以下命令以停止并卸载现有的 Caddy 守护程序:

php
valet stop
valet uninstall

接下来,您应该升级到最新版本的 Valet。根据您安装 Valet 的方式,通常通过 Git 或 Composer 完成。如果您通过 Composer 安装了 Valet,您应该使用以下命令更新到最新的主要版本:

php
composer global require laravel/valet

下载新的 Valet 源代码后,您应该运行 install 命令:

php
valet install
valet restart

升级后,可能需要重新 park 或重新 link 您的站点。

服务站点

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

"Park" 命令

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

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

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

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

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

lightbulb

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

使用 TLS 保护站点

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

php
valet secure laravel

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

php
valet unsecure laravel

共享站点

Valet 甚至包括一个命令来与世界共享您的本地站点。Valet 安装完成后,无需额外的软件安装。

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

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

exclamation

valet share 目前不支持共享已使用 valet secure 命令保护的站点。

自定义 Valet 驱动

您可以编写自己的 Valet "驱动" 来服务在 Valet 不原生支持的其他框架或 CMS 上运行的 PHP 应用程序。当您安装 Valet 时,会创建一个 ~/.valet/Drivers 目录,其中包含一个 SampleValetDriver.php 文件。此文件包含一个示例驱动实现,以演示如何编写自定义驱动。编写驱动只需要您实现三个方法:servesisStaticFilefrontControllerPath

所有三个方法都接收 $sitePath$siteName$uri 值作为其参数。$sitePath 是在您的机器上服务的站点的完全限定路径,例如 /Users/Lisa/Sites/my-project$siteName 是域的 "host" / "site name" 部分(my-project)。$uri 是传入请求的 URI(/foo/bar)。

完成自定义 Valet 驱动后,将其放置在 ~/.valet/Drivers 目录中,使用 FrameworkValetDriver.php 命名约定。例如,如果您正在为 WordPress 编写自定义 Valet 驱动,您的文件名应为 WordPressValetDriver.php

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

serves 方法

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

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

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 命令

命令描述
valet forget从 "parked" 目录运行此命令以将其从 parked 目录列表中移除。
valet paths查看所有 "parked" 路径。
valet restart重启 Valet 守护程序。
valet start启动 Valet 守护程序。
valet stop停止 Valet 守护程序。
valet uninstall完全卸载 Valet 守护程序。