首页 » Web技术 » Laravel » 正文

Laravel Valet — Mac 下 极简的 PHP 开发环境

一、简介

最近 Laravel 发布了一个 Mac 下极简的 Laravel 开发环境 — Valet。你不需要安装 Vagrant、Apache、Nginx,也不需要修改 /ect/hosts 文件。你甚至可以把本地的站点分享到公开的网络进行访问。

当你的电脑开机的时候,Laravel Valet 就会配置你的 Mac 自动在后台运行 PHP 内置的 WEB 服务。然后,通过 DnsMasq,Valet 会把所有的 .dev 域名指向你本地安装的站点。比如说你站点所在的文件夹叫做 blog-test-20160507,那么你在浏览器访问 blog-test-20160507.dev 的时候就会自动访问到该文件夹。

换句话说,Valet 是一个超级快的 Laravel 开发环境,只需要大约 7M RAM。Valet 并不是提到 Vagrant 或者 Homestead,而是提供了一个灵活的、速度极快的替代品,尤其是当你的电脑内存比较小的时候,它将是一个完美的选择。

默认情况下,Valet 支持以下程序:

此外,你还可以扩展 Valet 使它支持你自己的驱动程序,本文后面会说到。

选择 Homestead 还是 Valet ?

看过文档的话你应该知道,Laravel 还提供了另外一个 Laravel 本地开发环境 —  Homestead。Homestead 和 Valet 的区别在于它们的目标受众和本地开发方式。Homestead 提供了一个配置好 Nginx 的 Ubuntu 虚拟机。如果想要一个完全虚拟化的开发环境或者正在使用 Windows / Linux 系统的话,Homestead 是一个功能非常强大的选择。

Valet 只支持 Mac,而且需要你在本地安装 PHP 和 数据库服务,而这些通过 Homebrew 命令brew install php70 and brew install mariadb 可以很容易的实现。Valet 使用极少的资源消耗提供了一个极速的本地开发环境。所以,它非常适合那些只需要 PHP/MySQL 而不需要一个完整的虚拟化开发环境的人。

Homestead 和 Valet 对于你配置本地开发环境来说都是一个非常好的选择,而具体选择哪个就取决于你的喜好及团队的需求。

二、安装

Valet 需要 Mac 系统以及 Homebrew。在安装之前,你需要确保你本地的 80 端口没有被其他程序(如 Nginx、Apache)所占用。

  • 安装或通过 brew update 命令更新 Homebrew 到最新版本
  • 通过运行 brew services list 来确保 brew services 是可用的。如果不行的话,请添加它
  • 通过 brew install php70 来安装 PHP7.0,你可能需要先 tap PHP Homebrew formulas。如果你收到 “No similarly named formulae found.” 这样的提升,可以运行 brew install homebrew/php/php70 来安装它
  • 通过 composer global require laravel/valet 命令安装 Valet,并确保 ~/.composer/vendor/bin 目录被添加到了系统的 PATH 环境变量中(编辑 ~/.bash_profile 文件,没有的话自己创建一个,在其中添加 export PATH=~/.composer/vendor/bin:$PATH,然后执行 source ~/.bash_profile,然后执行 echo $PATH 确保是否添加成功了。)。
  • 执行 valet install 命令。这会配置并安装 Valet 和 DnsMasq,并把 Valet 添加到电脑开机时的自动启动程序中。

当 Valet 安装成功后,你可以在终端中 ping 任何 *.dev 域名,如 ping test-blog.dev,如果安装正确的话,你会看到大致如下的信息:

laravel-valet-ping

当电脑启动的时候,Valet 就会自动启动它的后台驻留程序,所以当 Valet 安装成功后你不需要在每次运行 valet up 或者 valet install 来启动它了。

数据库

如果你需要数据库的话,可以在命令行运行 brew install mariadb 来安装 MariaDB,当然你也可以选择 MySQL,然后通过 root 用户名和空密码来连接 127.0.0.1 数据库服务。

三、启动你的第一个 Valet 站点

一旦 Valet 安装成功,你就可以启动站点了,Valet 提供了两个命令来帮你启动 Laravel 站点:parklink

park 命令

下面以创建新站点来举个例子:

  • 使用 mkdir ~/Sites 命令创建一个新的文件夹,然后执行 cd ~/Sites 进入刚刚创建的目录,之后运行 valet park 命令,这条命令会把当前工作目录作为 Valet 寻找站点的路径。
  • 在当前目录创建新的 Laravel 站点:laravel new blog
  • 在浏览器打开 blog.dev 试试看是不是已经可以打开网址了?(使用站点文件夹名称+.dev的格式)

这样就可以了。并且所有位于你执行了 valet park 命令的目录(本例中的 ~/Sites)下的站点都可以通过这种方式来访问。

link 命令

link 命令也可以用来启动 Laravel 站点。park 命令会把这个目录下所有文件夹都当做独立的不同站点,而当你只需要启动一个站点的时候,可以使用 link 命令。

  • 进入站点所在目录,然后执行 valet link app-name注意此处为 Laravel 的项目名称,而非目录名称)。Valet 会在 ~/.valet/Sites 创建一个软链接执行当前工作目录。
  • 当上面的命令执行之后,你就可以在浏览器访问 http://app-name.dev

可以通过 valet links 命令查看 linked 目录,还可以通过 valet unlink app-name 命令取消软链接。

四、分享站点

Valet 提供了一个命令可以把你的站点分享给全世界,并且除了 Valet 外你不需要安装其他任何东西。

要分享站点,你需要在终端进入站点目录,然后运行 valet share 命令,之后就会生成一个公共的可访问的URL,并自动的把生成的链接添加到了你的剪切板中,你可以把它粘贴到浏览器中,也可以发送给其让人来访问。

laravel-valet-share

要停止分享,可以按 Control + C 来取消进程。

五、查看日志

如果你想查看所有站点的日志,可以运行 valet logs 命令,新的日志也会自动的展示在终端中。

六、定制 Valet 驱动

如果你使用 Valet 不支持的其他框架或者 CMS 的话,你也可以编写自己的 Valet “驱动”。当你安装好 Valet 之后,就会自动创建一个 ~/.valet/Drivers 文件夹,其中会包含一个 SampleValetDriver.php 文件。

这个文件包含了一个实现样例,为你展示了如何编写定制驱动。编写驱动,你只需要实现三个方法:servesisStaticFilefrontControllerPath

这三个方法都接收 $sitePath$siteName$uri 作为其参数。$sitePath 是你站点目录的完全路径,如 /Users/Specs/Sites/my-project$siteName 是“主机/网站名称”部分(my-project)。$uri 是传入的请求 URI(/foo/bar)。

当完成之后,你可以以 FrameworkValetDriver.php 命名方式把其放在 ~/.valet/Drivers 文件夹中。例如你编写 WordPress 驱动的话,应该将其命名为 WordPressValetDriver.php

下面让我们来看看你定制 Valet 驱动时应该实现的样例。

serves 方法

如果你的 Valet 需要处理传入请求的话,serves 方法应该返回 TRUE,否则应该返回 FALSE。所以在此方法中,你应该确定传入的 $sitePath 是否包含你需要服务的类型。

例如,假设我们在编写 WordPressValetDriver,那么该方法应该是下面这样:

public function serves($sitePath, $siteName, $uri)
{
    return is_dir($sitePath.'/wp-admin');
}

isStaticFile 方法

isStaticFile 应该判断接收的请求是否是静态文件,如图片、样式表等,该方法要返回文件所在硬盘中的全部路径。如果接收的请求不是静态文件,则返回 FALSE

public function isStaticFile($sitePath, $siteName, $uri)
{
    if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
        return $staticFilePath;
    }

    return false;
}

注意:isStaticFile 方法只有在 serves 方法返回 TRUE,并且进入的请求不是 / 的时候才会调用。

frontControllerPath 方法

frontControllerPath 方法应当返回你的“前端控制器”的全部路径,一般应该是 index.php 或者类似的文件:

public function frontControllerPath($sitePath, $siteName, $uri)
{
    return $sitePath.'/public/index.php';
}

七、其他 Valet 命令

命令描述
valet forget在 “parked” 的目录中执行该命令来把其从 parded 目录列表中删除。
valet paths查看所有 “parked” 路径
valet restart重启 Valet 程序
valet start启动 Valet 程序
valet stop停止 Valet 程序
valet uninstall卸载 Valet 程序

本文共 3 个回复

  • hanbing17 2016/05/15 17:04

    学习了

  • xoolee 2016/08/08 12:50

    mac 下 find 不显示 .env 之类的文件,怎么弄?

发表评论