Laravel Valet
简介
Valet 是 Mac 极简主义者的 Laravel 开发环境。不用 Vagrant,不用 /etc/hosts
文件。您甚至可以使用本地隧道公开分享您的站点。_是的,我们也对它爱不释手。_
Laravel Valet 将 Mac 配置为开机时一直在后台运行 Nginx。然后,使用 DnsMasq,Valet 将所有指向本地计算机站点的请求代理到 *.test
上。
换句话说,一个速度极快的 Laravel 开发环境只占用约 7 MB 内存。Valet 并不是想要完全替代 Vagrant 或者 Homestead,只是提供另外一种希望更灵活,更快速,或者计算机内存有限时的选择。
Valet 支持但不局限于以下内容:
- Laravel
- Lumen
- Bedrock
- CakePHP 3
- Concrete5
- Contao
- Craft
- Drupal
- Jigsaw
- Joomla
- Katana
- Kirby
- Magento
- OctoberCMS
- Sculpin
- Slim
- Statamic
- 静态 HTML
- Symfony
- WordPress
- Zend
当然,您也可以使用 自定义驱动 扩展 Valet。
Valet 或 Homestead
正如您所知道的,Laravel 提供了另一个本地开发环境 Homestead。Homestead 和 Valet 的不同之处在于目标用户和本地开发方式。Homestead 提供了一个完整的、自动配置 Nginx 的 Ubuntu 虚拟机。如果您想要一个完全虚拟化的 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 端口。
- 安装或使用
brew update
将 Homebrew 更新到最新版本。 - 通过 Homebrew 运行
brew install php@7.2
安装 PHP 7.2。 - 安装 Composer。
- 通过 Composer 运行
composer global require laravel/valet
安装 Valet。请确保~/.composer/vendor/bin
路径添加到了系统的环境变量「PATH」中。echo "export PATH=$PATH:~/.composer/vendor/bin" >> ~/.bash_profile source ~/.bash_profile
然后创建 PHP 链接:
brew link --force php@7.2
- 运行
valet install
命令。它会配置并安装 Valet 和 DnsMasq,并注册 Valet 的守护进程,以便在系统启动时运行。
安装 Valet 后,在终端使用 ping foobar.test
命令 ping 任意 *.test
域名,例如 ping foobar.test
。如果 Valet 安装正确,那么可以在终端上看到该域名来自 127.0.0.1
的响应。
每次启动计算机时,Valet 会自动启动其守护进程。所以只要完成了 Valet 的初次安装,就不用再运行 valet start
或 valet install
了。
使用其它域名
默认情况下,Valet 使用 .test
顶级域名为项目提供服务。如果您想使用其它域名,可以使用 valet domain tld-name
命令。
例如,如果您要使用 .app
而不是 .test
,只需运行 valet domain app
,Valet 会自动将站点域名改为 *.app
。
数据库
如果需要数据库,可以在命令行运行 brew install mysql@5.7
安装 MySQL。安装完成后,使用 brew services start mysql@5.7
命令启动 MySQL。然后,就可以使用 root
用户名和空字符串作为密码连接到 127.0.0.1
的数据库。
升级
可以在终端使用 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
下载新的源码之后,运行 install
命令:
valet install
valet restart
升级完成后,可能需要重新设置或链接站点。
设置站点
安装好 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
命令。例如,如果站点域名是 laravel.test
,可以运行下面的命令进行加密:
valet secure laravel
要取消加密并还原为 HTTP,可以使用 unsecure
命令。与 secure
命令一样,该命令接收要取消加密的站点名称:
valet unsecure laravel
分享站点
Valet 甚至还包含了一个向全世界分享本地站点的命令。安装了 Valet 就行,不需要再安装额外的软件。
要分享站点,先在终端里切换到站点目录,然后运行 valet share
命令。一个可公开访问网址会添加到剪贴板中,粘贴到浏览器就可以直接访问。就这么简单。
要停止分享站点,按 Control + C
取消进程。
valet share
目前不支持使用valet secure
命令对分享的站点加密。
自定义 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 驱动后,使用 FrameworkValetDriver.php
这样的命名规则将其放在 ~/.config/valet/Drivers
目录中。例如,如果您正在为 WordPress 编写自定义 Valet 驱动,那么文件名应该是 WordPressValetDriver.php
。
接下来看看自定义 Valet 驱动应该实现的每个方法的实现示例。
serves 方法
如果您的驱动要处理传入的请求,那么 serves
方法应该返回 true
。否则,该方法应返回 false
。因此,在该方法中,您需要决定给定的 $sitePath
是否包含您要提供服务的项目类型。
例如,假设我们在编写一个 WordPressValetDriver
。serve
方法可能如下所示:
/**
* 驱动是否应处理该请求
*
* @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 |