Laravel Valet
Introduction
Valet is a Laravel development environment for Mac minimalists. No Vagrant, no /etc/hosts
file. You can even share your sites publicly using local tunnels. Yeah, we like it too.
Laravel Valet configures your Mac to always run Nginx in the background when your machine starts. Then, using DnsMasq, Valet proxies all requests on the *.test
domain to point to sites installed on your local machine.
In other words, a blazing fast Laravel development environment that uses roughly 7 MB of RAM. Valet isn't a complete replacement for Vagrant or Homestead, but provides a great alternative if you want flexible basics, prefer extreme speed, or are working on a machine with a limited amount of RAM.
Out of the box, Valet support includes, but is not limited to:
- Laravel
- Lumen
- Bedrock
- CakePHP 3
- Concrete5
- Contao
- Craft
- Drupal
- ExpressionEngine
- Jigsaw
- Joomla
- Katana
- Kirby
- Magento
- OctoberCMS
- Sculpin
- Slim
- Statamic
- Static HTML
- Symfony
- WordPress
- Zend
However, you may extend Valet with your own custom drivers.
Valet Or Homestead
As you may know, Laravel offers Homestead, another local Laravel development environment. Homestead and Valet differ in regards to their intended audience and their approach to local development. Homestead offers an entire Ubuntu virtual machine with automated Nginx configuration. Homestead is a wonderful choice if you want a fully virtualized Linux development environment or are on Windows / Linux.
Valet only supports Mac, and requires you to install PHP and a database server directly onto your local machine. This is easily achieved by using Homebrew with commands like brew install php
and brew install mysql
. Valet provides a blazing fast local development environment with minimal resource consumption, so it's great for developers who only require PHP / MySQL and do not need a fully virtualized development environment.
Both Valet and Homestead are great choices for configuring your Laravel development environment. Which one you choose will depend on your personal taste and your team's needs.
Installation
Valet requires macOS and Homebrew. Before installation, you should make sure that no other programs such as Apache or Nginx are binding to your local machine's port 80.
- Install or update Homebrew to the latest version using
brew update
. - Install PHP 7.4 using Homebrew via
brew install php
. - Install Composer.
- Install Valet with Composer via
composer global require laravel/valet
. Make sure the~/.composer/vendor/bin
directory is in your system's "PATH". - Run the
valet install
command. This will configure and install Valet and DnsMasq, and register Valet's daemon to launch when your system starts.
Once Valet is installed, try pinging any *.test
domain on your terminal using a command such as ping foobar.test
. If Valet is installed correctly you should see this domain responding on 127.0.0.1
.
Valet will automatically start its daemon each time your machine boots. There is no need to run valet start
or valet install
ever again once the initial Valet installation is complete.
Using Another Domain
By default, Valet serves your projects using the .test
TLD. If you'd like to use another domain, you can do so using the valet tld tld-name
command.
For example, if you'd like to use .app
instead of .test
, run valet tld app
and Valet will start serving your projects at *.app
automatically.
Database
If you need a database, try MySQL by running brew install mysql@5.7
on your command line. Once MySQL has been installed, you may start it using the brew services start mysql@5.7
command. You can then connect to the database at 127.0.0.1
using the root
username and an empty string for the password.
PHP Versions
Valet allows you to switch PHP versions using the valet use php@version
command. Valet will install the specified PHP version via Brew if it is not already installed:
valet use php@7.2
valet use php
Valet only serves one PHP version at a time, even if you have multiple PHP versions installed.
Resetting Your Installation
If you are having trouble getting your Valet installation to run properly, executing the composer global update
command followed by valet install
will reset your installation and can solve a variety of problems. In rare cases it may be necessary to "hard reset" Valet by executing valet uninstall --force
followed by valet install
.
Upgrading
You may update your Valet installation using the composer global update
command in your terminal. After upgrading, it is good practice to run the valet install
command so Valet can make additional upgrades to your configuration files if necessary.
Serving Sites
Once Valet is installed, you're ready to start serving sites. Valet provides two commands to help you serve your Laravel sites: park
and link
.
The park
Command
- Create a new directory on your Mac by running something like
mkdir ~/Sites
. Next,cd ~/Sites
and runvalet park
. This command will register your current working directory as a path that Valet should search for sites. - Next, create a new Laravel site within this directory:
laravel new blog
. - Open
http://blog.test
in your browser.
That's all there is to it. Now, any Laravel project you create within your "parked" directory will automatically be served using the http://folder-name.test
convention.
The link
Command
The link
command may also be used to serve your Laravel sites. This command is useful if you want to serve a single site in a directory and not the entire directory.
- To use the command, navigate to one of your projects and run
valet link app-name
in your terminal. Valet will create a symbolic link in~/.config/valet/Sites
which points to your current working directory. - After running the
link
command, you can access the site in your browser athttp://app-name.test
.
To see a listing of all of your linked directories, run the valet links
command. You may use valet unlink app-name
to destroy the symbolic link.
You can use valet link
to serve the same project from multiple (sub)domains. To add a subdomain or another domain to your project run valet link subdomain.app-name
from the project folder.
Securing Sites With TLS
By default, Valet serves sites over plain HTTP. However, if you would like to serve a site over encrypted TLS using HTTP/2, use the secure
command. For example, if your site is being served by Valet on the laravel.test
domain, you should run the following command to secure it:
valet secure laravel
To "unsecure" a site and revert back to serving its traffic over plain HTTP, use the unsecure
command. Like the secure
command, this command accepts the host name that you wish to unsecure:
valet unsecure laravel
Serving A Default Site
Sometimes, you may wish to configure Valet to serve a "default" site instead of a 404
when visiting an unknown test
domain. To accomplish this, you may add a default
option to your ~/.config/valet/config.json
configuration file containing the path to the site that should serve as your default site:
"default": "/Users/Sally/Sites/foo",
Sharing Sites
Valet even includes a command to share your local sites with the world, providing an easy way to test your site on mobile devices or share it with team members and clients. No additional software installation is required once Valet is installed.
Sharing Sites Via Ngrok
To share a site, navigate to the site's directory in your terminal and run the valet share
command. A publicly accessible URL will be inserted into your clipboard and is ready to paste directly into your browser or share with your team.
To stop sharing your site, hit Control + C
to cancel the process.
You may pass additional parameters to the share command, such as valet share --region=eu
. For more information, consult the ngrok documentation.
Sharing Sites Via Expose
If you have Expose installed, you can share your site by navigating to the site's directory in your terminal and running the expose
command. Consult the expose documentation for additional command-line parameters it supports. After sharing the site, Expose will display the sharable URL that you may use on your other devices or amongst team members.
To stop sharing your site, hit Control + C
to cancel the process.
Sharing Sites On Your Local Network
Valet restricts incoming traffic to the internal 127.0.0.1
interface by default. This way your development machine isn't exposed to security risks from the Internet.
If you wish to allow other devices on your local network to access the Valet sites on your machine via your machine's IP address (eg: 192.168.1.10/app-name.test
), you will need to manually edit the appropriate Nginx configuration file for that site to remove the restriction on the listen
directive by removing the 127.0.0.1:
prefix on the directive for ports 80 and 443.
If you have not run valet secure
on the project, you can open up network access for all non-HTTPS sites by editing the /usr/local/etc/nginx/valet/valet.conf
file. However, if you're serving the project site over HTTPS (you have run valet secure
for the site) then you should edit the ~/.config/valet/Nginx/app-name.test
file.
Once you have updated your Nginx configuration, run the valet restart
command to apply the configuration changes.
Site Specific Environment Variables
Some applications using other frameworks may depend on server environment variables but do not provide a way for those variables to be configured within your project. Valet allows you to configure site specific environment variables by adding a .valet-env.php
file within the root of your project. These variables will be added to the $_SERVER
global array:
<?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',
],
];
Proxying Services
Sometimes you may wish to proxy a Valet domain to another service on your local machine. For example, you may occasionally need to run Valet while also running a separate site in Docker; however, Valet and Docker can't both bind to port 80 at the same time.
To solve this, you may use the proxy
command to generate a proxy. For example, you may proxy all traffic from http://elasticsearch.test
to http://127.0.0.1:9200
:
valet proxy elasticsearch http://127.0.0.1:9200
You may remove a proxy using the unproxy
command:
valet unproxy elasticsearch