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 php
和 brew install mysql
。Valet 以最少的资源消耗提供了一个极快的本地开发环境,非常适合只需要 PHP 和 MySQL 且不需要完全虚拟化开发环境的开发者。
Valet 和 Homestead 都是配置 Laravel 开发环境的绝佳选择,使用哪一个仅仅取决于个人喜好和团队的需求。
安装
Valet 需要 macOS 和 Homebrew。 在安装之前,需要确保没有其它应用程序(如 Apache 或 Nginx)占用本地机器的 80 端口。
安装完 Valet 后,可以试试在你的命令行终端上使用 ping foobar.test
命令 ping 任何 *.test
域名,如果 Valet 安装正确你会看到来自 127.0.0.1
的响应。
每次你的计算机启动时 Valet 都会自动启动它的守护进程, 所以只要完成了 Valet 的安装,就无需再执行 valet start
或 valet 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 站点配置服务:park
和 link
。
park
命令
就这么简单。 现在,你在「parked」目录中创建的任何 Laravel 项目都自动使用 http://folder-name.test
的方式访问。
link
命令
link
命令也可以用来为你的 Laravel 站点提供服务。如果要为目录中的单个站点而不是整个目录提供服务,则此命令非常有用。
要查看所有的目录链接,请运行 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
目录。该文件包含一个示例驱动程序实现,演示了如何编写一个自定义的驱动程序。编写驱动程序仅需要你去实现三个方法:serves
,isStaticFile
和 frontControllerPath
。
这三个方法都接受 $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 站点配置,这些文件在运行 install 、secure 和 tld 命令时会重建。 |
~/.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 默认配置。 |
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: