Valet

未匹配的标注

Laravel Valet

简介

Valet 是 Mac 极简主义者的 Laravel 开发环境。没有 Vagrant,不需要配置 /etc/hosts 文件。你甚至可以使用本地隧道公开共享你的网站。 是的,我们都喜欢 Valet。

Laravel Valet 为你的 Mac 设置了开机后始终在后台运行 Nginx 服务。然后,Valet 使用 DnsMasq 代理所有 *.test 域名的请求,指向安装在你本地计算机上的站点。

换句话说,一个速度极快的 Laravel 开发环境只占用大约 7 MB 内存。Valet 并不是要取代 Vagrant 或者 Homestead,而是另外提供一种使用起来更灵活、快速且内存占用更少的选择。

开箱即用,Valet 支持包括但不限于以下内容:

当然,你也可以使用 自定义驱动 来拓展你的 Valet。

Valet 还是 Homestead

你应该知道,Laravel 还提供了另外一种本地开发环境 Homestead。Homestead 和 Valet 的不同之处在于目标受众和本地开发方式。 Homestead 提供了一个能自动化配置 Nginx 的完整的 Ubuntu 虚拟机。如果你想在 Windows 或者 Linux 系统上实现完全虚拟化的 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 的 brew install php 命令安装 PHP 7.4。
  • 安装 Composer
  • 使用 Composer 的 composer global require laravel/valet 命令安装 Valet,并确保 ~/.composer/vendor/bin 目录在系统的「PATH」中。
  • 运行 valet install 命令来安装并配置 Valet 和 DnsMasq,并注册 Valet 守护进程随系统启动时自动运行。

安装完 Valet 后,可以试试在你的命令行终端上使用 ping foobar.test 命令 ping 任何 *.test 域名,如果 Valet 安装正确你会看到来自 127.0.0.1 的响应。

每次你的计算机启动时 Valet 都会自动启动它的守护进程, 所以只要完成了 Valet 的安装,就无需再执行 valet startvalet install

数据库

如果你要使用数据库,请在命令行终端运行 brew install mysql@5.7 安装 MySQL,安装完成后,你可以使用 brew services start mysql@5.7 命令启动 MySQL,然后你可以使用 root 用户名和空密码连接到 127.0.0.1 的数据库。

PHP 版本

Valet 允许你使用 valet use php@version 命令切换 PHP 版本,如果指定的 PHP 版本还没有安装,Valet 会通过 Brew 安装:

valet use php@7.2

valet use php

注意:即使你安装了多个版本的 PHP,Valet 一次也只能使用一个版本提供服务。

重新安装

如果你的 Valet 无法正常运行,执行 composer global update 命令后再执行 valet install 重新安装可解决各种问题。在极少数情况下,可能需要执行 valet uninstall --force 后然执行 valet install 来「硬复位」 Valet。

升级

你可以在命令行终端运行 composer global update 更新你的 Valet。更新完成后,最好再运行一次 valet install 命令,这样 Valet 可以在必要时对配置文件进行升级。

服务站点

安装 Valet 之后,你就可以配置站点,Valet 提供了2个命令来为你的 Laravel 站点配置服务:parklink

park 命令

- 运行 `mkdir ~/Sites` 命令在你的 Mac 上创建一个新的目录,然后,运行 `cd ~/Sites` 和 `valet park` 命令将当前的工作目录注册为 Valet 搜索站点的路径。 - 接下来,在这个目录下运行 `laravel new blog` 命令创建一个 Laravel 站点。 - 在你的浏览器中打开 `http://blog.test`。

就这么简单。 现在,你在「parked」目录中创建的任何 Laravel 项目都自动使用 http://folder-name.test 的方式访问。

link 命令

link 命令也可以用来为你的 Laravel 站点提供服务。如果要为目录中的单个站点而不是整个目录提供服务,则此命令非常有用。

- 要使用这条命令,请在命令行终端进入你的项目目录中运行 `valet link app-name` 命令。Valet 会在 `~/.config/valet/Sites` 目录中创建一个指向当前工作目录的符号链接。 - 在运行 `link` 命令后,你可以在浏览器中通过 `http://app-name.test` 访问站点。

要查看所有的目录链接,请运行 valet links 命令。您可以使用 valet unlink app-name 命令删除动态链接。

技巧:您可以使用 valet link 命令将多个(子)域名连接到同一个项目。在项目目录下运行 valet link subdomain.app-name 命令以添加一个子域名或另外一个域名到您的项目中。

使用 TLS 保护站点

默认情况下,Valet 服务器站点仅有 HTTP 协议。当然,如果您想要使用 HTTP/2 通过 TLS 加密您的站点,您可以使用 secure 命令。例如,如果您的站点通过 Valet 在 laravel.test 域名上提供服务,您可以使用如下命令以为站点实现安全保护功能:

valet secure laravel

要 「解除保护」并回退至 HTTP ,请使用 unsecure 命令。像 secure 命令一样,该命令接受您想要解除保护的主机名:

valet unsecure laravel

共享站点

Valet 甚至包含了一个命令,用于与全世界共享您的站点,它提供了一种方便的可在手机上测试站点或和您的团队成员共享站点的方式。当 Valet 完成安装后便不再需要安装任何额外的软件。

使用 Ngrok 共享站点

要共享站点,请在终端中定位到站点目录,并运行 valet share 命令。一个公开可访问的 URL 将会插入到您的剪贴板中,您可以分享它给您的团队成员或在浏览器中打开它。

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

技巧: 您可以向 share 命令传递额外的参数, 如 valet share --region=eu。 更多信息,请参考 ngrok 文档

通过 Expose 共享站点

如果你安装了 Expose,打开命令行进入网站根目录执行 expose 就可以共享你的网站。查看 expose 文档获取更多支持的命令行参数。成功共享站点后,Expose 将显示可共享的 URL,您可以在其他设备上或在团队成员之间使用该 URL。

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

在本地网络上共享站点

默认情况下,Valet 将传入流量限制为内部 127.0.0.1 接口。这样,您的开发机器就不会暴露在来自 Internet 的安全风险中。

如果你希望允许其他设备在你的本地网络访问 Valet 站点通过你的机器的 IP 地址在您的机器上 (比如:192.168.1.10 / app-name.test ),你将需要为该站点手动编辑 Nginx 配置文件,通过删除用于 80 和 443 端口指令上的 127.0.0.1: 前缀来消除对 listen 指令的限制。

如果你还没有运行 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

// 设置站点 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

valet proxy elasticsearch http://127.0.0.1:9200

你可以使用 unproxy 命令来移除代理:

valet unproxy elasticsearch

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

valet proxies

自定义 Valet 驱动

你可以编写你自己的 Valet『驱动』来为 Valet 原本不支持的其它框架或 CMS 上运行的 PHP 应用程序提供服务。当你安装 Valet 时,会创建一个包含 SampleValetDriver.php 文件的 ~/.config/valet/Drivers 目录。该文件包含一个示例驱动程序实现,演示了如何编写一个自定义的驱动程序。编写驱动程序仅需要你去实现三个方法:servesisStaticFilefrontControllerPath

这三个方法都接受 $sitePath$siteName$uri 值作为参数。$sitePath 是你的机器上提供站点的完全限定路径。比如 /Users/Lisa/Sites/my-project$siteName 是域(my-project)的『主机』/『站点名称』部分。$uri 是即将到来的请求 URL(/foo/bar

一旦你完成你的自定义 Valet 驱动,使用 FrameworkValetDriver.php 命名约定将它放置在 ~/.config/valet/Drivers 目录中。例如,如果你为 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 方法对即将到来的请求且请求 URI 不是 / 返回 true 时,才会调用 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

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 添加文件修改权限使 Valet 输入命令的时候不需要输入密码。
valet uninstall 卸载 Valet 守护进程:显示手动卸载的向导或使用 --force 命令强制卸载之。

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.json Valet 的主要配置文件。
~/.config/valet/valet.sock Valet 的 Nginx 配置文件使用的 PHP-FPM socket, 这个文件只有 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 用于生成站点证书的 Nginx 默认配置。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
贡献者:6
讨论数量: 0
发起讨论 只看当前版本


暂无话题~