Laravel Valet
介绍
Valet 是为 Mac 极简主义者设计的 Laravel 开发环境。无需 Vagrant,无需 /etc/hosts
文件。您甚至可以使用本地隧道公开共享您的站点。是的,我们也喜欢它。
Laravel Valet 配置您的 Mac 以在机器启动时始终在后台运行 Nginx。然后,使用 DnsMasq,Valet 将所有 *.test
域的请求代理到安装在本地机器上的站点。
换句话说,这是一个超快的 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 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 start
或 valet install
。
使用其他域
默认情况下,Valet 使用 .test
TLD 服务您的项目。如果您想使用其他域,可以使用 valet tld tld-name
命令。
例如,如果您想使用 .app
而不是 .test
,请运行 valet tld app
,Valet 将自动开始在 *.app
上服务您的项目。
数据库
如果您需要数据库,请尝试通过命令行运行 brew install mysql@5.7
安装 MySQL。MySQL 安装完成后,您可以使用 brew services start mysql@5.7
命令启动它。然后,您可以使用 root
用户名和空字符串作为密码连接到数据库 127.0.0.1
。
PHP 版本
Valet 允许您使用 valet use php@version
命令切换 PHP 版本。如果指定的 PHP 版本尚未安装,Valet 将通过 Brew 安装它:
valet use php@7.2
valet use php
升级
您可以在终端中使用 composer global update
命令更新您的 Valet 安装。升级后,最好运行 valet install
命令,以便 Valet 可以在必要时对您的配置文件进行额外升级。
升级到 Valet 2.0
Valet 2.0 将 Valet 的底层 Web 服务器从 Caddy 过渡到 Nginx。在升级到此版本之前,您应该运行以下命令以停止并卸载现有的 Caddy 守护程序:
valet stop
valet uninstall
接下来,您应该升级到 Valet 的最新版本。根据您安装 Valet 的方式,通常通过 Git 或 Composer 完成。如果您通过 Composer 安装了 Valet,您应该使用以下命令更新到最新的主要版本:
composer global require laravel/valet
一旦下载了新的 Valet 源代码,您应该运行 install
命令:
valet install
valet restart
升级后,可能需要重新 park 或重新 link 您的站点。
服务站点
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” 命令也可以用来服务您的 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
要“unsecure”站点并恢复到通过普通 HTTP 服务其流量,请使用 unsecure
命令。与 secure
命令一样,此命令接受您希望 unsecure 的主机名:
valet unsecure laravel
共享站点
Valet 甚至包括一个命令来与世界共享您的本地站点。Valet 安装完成后,无需额外的软件安装。
要共享站点,请在终端中导航到站点的目录并运行 valet share
命令。一个可公开访问的 URL 将被插入到您的剪贴板中,并准备好直接粘贴到您的浏览器中。就是这样。
要停止共享您的站点,请按 Control + C
取消该过程。
自定义 Valet 驱动
您可以编写自己的 Valet “驱动”来服务在 Valet 不原生支持的其他框架或 CMS 上运行的 PHP 应用程序。当您安装 Valet 时,会创建一个 ~/.config/valet/Drivers
目录,其中包含一个 SampleValetDriver.php
文件。此文件包含一个示例驱动实现,以演示如何编写自定义驱动。编写驱动只需要您实现三个方法:serves
、isStaticFile
和 frontControllerPath
。
所有三个方法都接收 $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
方法可能如下所示:
/**
* 确定驱动是否服务请求。
*
* @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
方法对传入请求返回 true
且请求 URI 不是 /
时,才会调用 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 | 从“parked”目录运行此命令以将其从 parked 目录列表中移除。 |
valet paths | 查看所有“parked”路径。 |
valet restart | 重启 Valet 守护程序。 |
valet start | 启动 Valet 守护程序。 |
valet stop | 停止 Valet 守护程序。 |
valet uninstall | 完全卸载 Valet 守护程序。 |