Laravel Valet
简介
Valet 是 Mac 极简主义者的 Laravel 开发环境。没有 Vagrant,不需要配置 /etc/hosts
文件。甚至可以使用本地隧道公开共享你的站点。是的,我们都喜欢Valet。
Laravel Valet 为您的 Mac 设置了开机后始终在后台运行 Nginx 服务。然后,Valet 使用 DnsMasq 将所有指向安装在本地的计算机站点请求代理到 *.test
结尾的域名上。
换句话说,一个速度极快的 Laravel 开发环境只占用 7MB 内存。Valet 并不是想要完全替换 Vagrant 或 Homestead,只是提供另外一种使用起来更加灵活、方便、以及内存占用更小的选择。
Valet 支持但不局限于以下内容:
- Laravel
- Lumen
- Bedrock
- CakePHP 3
- Concrete5
- Contao
- Craft
- Drupal
- Jigsaw
- Joomla
- Katana
- Kirby
- Magento
- OctoberCMS
- Sculpin
- Slim
- Statamic
- Static HTML
- Symfony
- WordPress
- Zend
当然,您也可以使用 custom drivers 来拓展您的 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 端口。
- 使用
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 start
或 valet install
。
使用其它域名
默认情况下,Valet 使用 .test
顶级域名为你的项目提供服务。如果你想使用其它域名,可以使用 valet tld tld-name
命令。
例如,如果你想使用 .app
来代替 .test
,运行 valet tld app
,Valet 会自动将站点顶级域名改为 *.app
。
数据库
如果你要使用数据库,请在终端运行 brew install mysql@5.7
安装 MySQL。一旦安装完成,你可以使用 brew services start mysql@5.7
命令启动 MySQL。然后,你可以使用 root
用户名和空字符串密码连接到 127.0.0.1
的数据库。
PHP Versions
Valet 允许你使用 valet use php@version
命令来切换 PHP 版本。如果指定版本尚未安装,Valet 将通过 Brew 来安装指定的 PHP 版本:
valet use php@7.2
valet use php
注意:即使你安装了多个 PHP 版本,Valet 服务一次只能提供一个 PHP 版本。
重新安装
如果 Valet 无法正常运行,那么执行 composer global update
命令,然后执行 valet install
,将重新安装,可以解决各种问题。在极少数情况下,可能有必要通过执行 Valet uninstall—force
,紧接着 Valet install
来 『硬复位』。
升级
你可以在终端使用 composer global update
命令来更新 Valet。升级后,如有需要,最好再次运行 valet install
,以便 Valet 对配置文件进行升级。
服务站点
安装了 Valet 之后,你就可以开始设置站点。Valet 提供两个命令来为 Laravel 的站点提供服务:park
和 link
。
park 命令
- 运行
mkdir ~/Sites
命令在 Mac 上创建一个新的目录。接下来,运行cd ~/Sites
和valet park
将当前的工作目录作为 Valet 搜索站点的路径。- 接下来,在这个目录中创建一个新的 Laravel 站点:laravel new blog
。- 在浏览器中打开http://blog.test
。
就这么多。 现在,你在 『parked』的目录中创建的任何 Laravel 项目都将自动使用 http://folder-name.test
这种方式访问。
link 命令
如果要在目录中提供单个站点而不是整个目录,就使用 link
命令。
- 要使用该命令,先在终端里切换到你的某个项目并运行
valet link app-name
。Valet 会在~/.config/valet/Sites
中创建一个符号链接指向当前的目录。- 运行link
命令后,你可以在浏览器通过http://app-name.test
访问站点。
运行 valet links
命令可以查看所有目录链接的列表。你还可以使用 valet unlink app-name
来删除符号链接。
Tip:你可以使用
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
去取消该过程。
Tip: 您可以向share命令传递额外的参数, 如
valet share —region=eu
。 更多信息,请参考 ngrok 文档.
在本地网络上共享站点
默认情况下,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
// Set $_SERVER['key'] to "value" for the foo.test site...
return [
'foo' => [
'key' => 'value',
],
];
// Set $_SERVER['key'] to "value" for all sites...
return [
'*' => [
'key' => 'value',
],
];
自定义 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 守护进程 |
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 配置使用的 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
Laravel China 社区:https://learnku.com/docs/laravel/7.x/valet/7451