Laravel Valet

# Introduction

Valet es un entorno de desarrollo para minimalistas de Mac. No Vagrant, sin archivo /etc/hosts. Incluso se pueden compartir los sitios de forma pública utilizando tunes locales. Sí, también nos gusta.

Laravel Valet configura su Mac para ejecutar Nginx en segundo plano cuando la máquina arranca. Entonces, utilizando DnsMasq, Valet crea un proxy de todas las peticiones sobre el dominio *.dev para apuntar a los sitios instalados en su máquina.

En otras palabras, un entorno de desarrollo tremendamente potente que utiliza únicamente 7 MB de RAM. Valet no es un reemplazo para Vagrant o Homestead, sino una alternativa si se prefieren servicios básicos, alta velocidad o se está trabajando en una máquina con RAM limitada.

Por defecto, Valet soporta, pero no limitado a:

Sin embargo, se puede extender Valet con drivers propios.

Valet O Homestead

Como ya puede que sepa, Laravel ofrece Homestead, otro entorno de desarrollo local. Homestead y Valet difieren en la audiencia y en el enfoque. Homestead incluye una máquina virtual Ubuntu completa con configuración Nginx automática. Homestead es una buena elección si se quiere tener una máquina Linux virtualizada como entorno de desarrollo o se está en Windows o Linux.

Valet únicamente soporta Mac y requiere instalar PHP y un servidor de base de datos directamente en la máquina local. Esto es muy sencillo utilizando Homebrew con comandos como brew install php71 y bre install mysql. Valet provee de un rapidísimo entorno de desarrollo con un consumo de recursos mínimo, por lo que es bueno para desarrolladores quienes únicamente necesitan PHP / MySQL y no necesitan un entorno virtualizado completo.

Ambos son buenas opciones para configurar el entorno de desarrollo local. Cual elegir ya es decisión personal de cada individuo o equipo dependiendo de sus necesidades.

# Installación

Valet require macOS y Homebrew. Antes de instalar, hay que asegurarse de no tener otros programas como Apache o Nginx enlazados al puerto 80.

  • Instalar o actualizar Homebrew a la última versión con brew update.
  • Instalar PHP 7.4 usando Homebrew a través de brew install php.
  • Instalar Composer.
  • Instalar Valet con Composer vía composer global require laravel/valet. Asegurarse que el directorio ~/.composer/vendor/bin está en el "PATH" del sistema.
  • Ejecutar el comando valet install. Esto configurará e instalará Valet y DnsMasq y registrará el daemon para que Valet se ejecute cuando el sistema arranca.

Una vez que Valet se ha instalado, pruebe a hacer ping a cualquier dominio *.dev desde la terminal ping foobar.dev. Si Valet está correctamente instalado se debería ver que este dominio responde 127.0.0.1.

Valet arrancará su daemon cada vez que la máquina inicie. No es necesario ejecutar valet start o valet install de nuevo una vez que la instalación de Valet esté completa.

Base de datos

Si necesitas una base de datos, prueba MySQL ejecutando brew install mysql@5.7" en tu línea de comandos. Una vez que MySQL ha sido instalado, puede iniciarlo usando el comando brew services start mysql@5.7. Luego puede conectarse a la base de datos en 127.0.0.1 usando el nombre de usuario "root" y una cadena vacía para la contraseña.

PHP Versions

Valet le permite cambiar de versión de PHP usando el comando "valet use php@version. El valet instalará la versión de PHP especificada a través de Brew si no está ya instalada:

valet use php@7.2

valet use php

El valet sólo sirve una versión de PHP a la vez, aunque tenga varias versiones de PHP instaladas.

Reiniciando su instalación

Si tiene problemas para que su instalación de valet funcione correctamente, la ejecución del comando composer global update seguido de valet install restablecerá su instalación y puede resolver una variedad de problemas. En raros casos puede ser necesario "hard reset" Valet ejecutando valet uninstall --force seguido de "valet install".

Actualización

Se puede actualizar la instalación de Valet utilizando el comando composer global update. Después de actualizar, es una buena práctica ejecutar el comando valet install para que Valet pueda ejecutar actualizaciones adicionales a los archivos de configuración si fuera necesario.

# Servir sitios

Una vez que Valet se ha instalado, ya está listo para servir aplicaciones. Valet provee dos comandos para este propósito: park y link.

El comando park

  • Cree un nuevo directorio en su Mac como por ejemplo mkdir ~/Sites. A continuación, cd ~/Sites y ejecute valet park. Este comando incluirá el directorio actual en la lista que Valet debe buscar por sitios.
  • A continuación, se puede crear una aplicación Laravel en este directorio laravel new blog.
  • Acceder a http://blog.test en el navegador.

Eso es todo. Cualquier proyecto que se cree en el directorio "parked" se servirá automáticamente utilizando la convención http://folder-name.test.

El comando link se puede utilizar para servir sitios Laravel. Este comando resulta útil si se pretende servir un sitio en un directorio concreto pero no el directorio completo.

  • Para utilizar el comando, hay que navegar hasta el directorio y ejecutar valet link nombre en la terminal. Valet creará un enlace simbólico en ~/.valet/Sites que apuntará al directorio de la aplicación.
  • Tras ejecutar el comando link, se puede acceder al sitio desde el navegador http://app-name.test.

Para ver un listado de todos sus directorios vinculados, ejecute el comando valet links Puede usar valet unlink app-name para destruir el enlace simbólico.

Puedes usar valet link para servir el mismo proyecto desde múltiples (sub)dominios. Para añadir un subdominio u otro dominio al proyecto, ejecuta valet link subdomain.app-name" desde la carpeta del proyecto.

Asegurando sitios con TLS

Por defecto, Valet sirve los sitios a través de HTTP. Sin embargo, si se pretende servir un sitio con encriptación TLS utilizando HTTP/2, utilizar el comando secure. Por ejemplo, si el sitio se sirve bajo el dominio laraveles.dev:

valet secure laravel

Para "insegurizar" un sitio y volver a servir el tráfico sobre HTTP, utilizar el comando unsecure. Así como el comando secure, acepta el nombre de host al que se aplica

valet unsecure laravel

# Compartir sitios

Valet incluso incluye un comando para compartir sus sitios locales con el mundo, proporcionando una manera fácil de probar su sitio en dispositivos móviles o compartirlo con los miembros del equipo y clientes. No es necesario instalar ningún software adicional una vez que Valet está instalado.

Compartir sitios a través de Ngrok

Para compartir un sitio, navega al directorio del sitio en tu terminal y ejecuta el comando valet share. Se insertará una URL de acceso público en su portapapeles y estará lista para pegar directamente en su navegador o compartir con su equipo.

Para dejar de compartir su sitio, presione Control + C para cancelar el proceso.

Puede pasar parámetros adicionales al comando share, como "valet share --region=eu". Para más información, consulte la "documentación de ngrok."

Compartir sitios a través de Expose

Si tiene instalado Expose, puede compartir su sitio navegando al directorio del sitio en su terminal y ejecutando el comando expose. Consulte la documentación de Expose para conocer los parámetros adicionales de línea de comandos que admite. Después de compartir el sitio, Expose mostrará la URL compartida que puede utilizar en sus otros dispositivos o entre los miembros del equipo.

Para dejar de compartir su sitio, presione Control + C para cancelar el proceso.

Compartir sitios en su red local

El aparcacoches restringe el tráfico de entrada a la interfaz interna 127.0.0.1 por defecto. De esta manera su máquina de desarrollo no está expuesta a riesgos de seguridad de Internet.

Si desea permitir que otros dispositivos de su red local accedan a los sitios de Valet en su máquina a través de la dirección IP de su máquina (eg: 192.168.1.10/app-name.test), necesitará editar manualmente el archivo de configuración de Nginx apropiado para ese sitio para eliminar la restricción de la directiva listen eliminando el prefijo 127.0.0.1: en la directiva para los puertos 80 y 443.

Si no ha ejecutado valet secure en el proyecto, puede abrir el acceso a la red para todos los sitios que no sean del HTTPS editando el archivo /usr/local/etc/nginx/valet/valet.conf. Sin embargo, si estás sirviendo el sitio del proyecto a través de HTTPS (has ejecutado valet secure para el sitio) entonces deberías editar el archivo ~/.config/valet/Nginx/app-name.test.

Una vez que haya actualizado su configuración de Nginx, ejecute el comando de reinicio del valet para aplicar los cambios de configuración.

# Variables del entorno específico del sitio

Algunas aplicaciones que utilizan otros marcos pueden depender de variables de entorno de servidor, pero no proporcionan una forma de configurar esas variables dentro de su proyecto. Valet le permite configurar variables de entorno específicas del sitio añadiendo un archivo .valet-env.php fdentro de la raíz de su proyecto. Estas variables se añadirán al array global $_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',
    ],
];

# Servicios de representación

A veces, puede que desee enviar un dominio de Valet a otro servicio de su máquina local. Por ejemplo, puede que ocasionalmente necesite ejecutar Valet mientras también ejecuta un sitio separado en Docker; sin embargo, Valet y Docker no pueden conectarse al puerto 80 al mismo tiempo.

Para resolver esto, puede usar el comando proxy para generar un proxy. Por ejemplo, puede proxy todo el tráfico de http://elasticsearch.test a http://127.0.0.1:9200:

valet proxy elasticsearch http://127.0.0.1:9200

Puede eliminar un proxy usando el comando  unproxy:

valet unproxy elasticsearch

Puede usar el comando proxies para listar todas las configuraciones del sitio que son proxies:

valet proxies

# Conductores de valet a medidaCustom Valet Drivers

Puede escribir su propio "driver" Valet para servir aplicaciones PHP que se ejecuten en otro marco o CMS que no sea soportado nativamente por Valet. Al instalar Valet, se crea un directorio ~/.config/valet/Drivers que contiene un archivo SampleValetDriver.php. Este archivo contiene una implementación de controlador de muestra para demostrar cómo escribir un controlador personalizado. La escritura de un controlador sólo requiere la implementación de tres métodos: serves, isStaticFile, y frontControllerPath.

Los tres métodos reciben los valores $sitePath, $siteName, y $uri como argumentos. El es el camino completamente calificado para el sitio que se sirve en su máquina, como /Users/Lisa/Sites/my-project. El $siteNamees la porción de "host" / "site name" del dominio (my-project). El $uri es la URI de la solicitud entrante ("/foo/bar").

Una vez que haya completado su controlador de valet personalizado, colóquelo en el directorio ~/.config/valet/Drivers usando la convención de nombres FrameworkValetDriver.php. Por ejemplo, si está escribiendo un controlador personalizado de valet para WordPress, su nombre de archivo debe ser  WordPressValetDriver.php.

Echemos un vistazo a un ejemplo de implementación de cada método que su conductor de Valet personalizado debería implementar.

El metodo serves

El método serves debería devolver "true si su conductor debe manejar la solicitud entrante. De lo contrario, el método debería devolver false. Así que, dentro de este método deberías intentar determinar si el $sitePath dado contiene un proyecto del tipo que estás intentando servir.

Por ejemplo, imaginemos que estamos escribiendo un WordPressValetDriver. Nuestro método serves podría parecerse a algo como esto:

/**
 * Determine if the driver serves the request.
 *
 * @param  string  $sitePath
 * @param  string  $siteName
 * @param  string  $uri
 * @return bool
 */
public function serves($sitePath, $siteName, $uri)
{
    return is_dir($sitePath.'/wp-admin');
}

El método isStaticFile

El isStaticFile debe determinar si la solicitud entrante es para un archivo "static", como una imagen o una hoja de estilo. Si el archivo es estático, el método debería devolver la ruta totalmente cualificada al archivo estático en el disco. Si la solicitud entrante no es para un archivo estático, el método debería devolver false:

/**
 * Determine if the incoming request is for a static file.
 *
 * @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;
}

El métod isStaticFile sólo se llamará si el método serves devuelve true para la solicitud entrante y la URI de la solicitud no es /.

El método frontControllerPath

El método frontControllerPath debe devolver la ruta totalmente cualificada al "controlador frontal" de su aplicación, que suele ser su archivo "index.php" o equivalente:

/**
 * Get the fully resolved path to the application's front controller.
 *
 * @param  string  $sitePath
 * @param  string  $siteName
 * @param  string  $uri
 * @return string
 */
public function frontControllerPath($sitePath, $siteName, $uri)
{
    return $sitePath.'/public/index.php';
}

Drivers locales

Para definir un driver de Valet personalizado para una aplicación concreta, hay que crear un LocalValetDriver.php en el directorio raíz de la aplicación. El driver puede heredar de la clase ValetDriver o cualquier otro específico como LaravelValetDriver:

class LocalValetDriver extends LaravelValetDriver
{
    /**
     * Determine if the driver serves the request.
     *
     * @param  string  $sitePath
     * @param  string  $siteName
     * @param  string  $uri
     * @return bool
     */
    public function serves($sitePath, $siteName, $uri)
    {
        return true;
    }

    /**
     * Get the fully resolved path to the application's front controller.
     *
     * @param  string  $sitePath
     * @param  string  $siteName
     * @param  string  $uri
     * @return string
     */
    public function frontControllerPath($sitePath, $siteName, $uri)
    {
        return $sitePath.'/public_html/index.php';
    }
}

# Otros comandos de Valet

Comandos Descripción
valet forget Ejecute este comando desde un directorio "aparcado" para eliminarlo de la lista de directorios aparcados.
valet log Vea una lista de los registros escritos por los servicios de Valet.
valet paths Vea una lista de los registros escritos por los servicios de Valet.
valet restart Reinicie el demonio del valet.
valet start Inicie el demonio del valet.
valet stop Detengan al demonio valet.
valet trust Añade los archivos de sudoers para Brew y Valet para permitir que los comandos de Valet se ejecuten sin pedir contraseñas.
valet uninstall Desinstale el valet: Muestra las instrucciones para la desinstalación manual; o pasa el parámetro --force parameter to aggressively delete all of Valet.

# Directorios y archivos de Valet

La siguiente información de directorios y archivos puede serle útil para solucionar problemas con su entorno de Valet:

Archivo / Ruta Descripción
~/.config/valet/ Contiene toda la configuración de Valet. Es posible que desee mantener una copia de seguridad de esta carpeta.
~/.config/valet/dnsmasq.d/ Contiene la configuración de DNSMasq.
~/.config/valet/Drivers/ Contiene conductores de valet personalizados.
~/.config/valet/Extensions/ Contiene extensiones / comandos personalizados de Valet.
~/.config/valet/Nginx/ Contiene todas las configuraciones del sitio Nginx generadas por Valet. Estos archivos son reconstruidos cuando se ejecutan los comandos install, secure, y tld.
~/.config/valet/Sites/ Contiene todos los enlaces simbólicos de los proyectos vinculados.
~/.config/valet/config.json El archivo maestro de configuración del valet
~/.config/valet/valet.sock El socket PHP-FPM usado por la configuración de Nginx de Valet. Esto solo existirá si PHP se está ejecutando correctamente.
~/.config/valet/Log/fpm-php.www.log Registro de usuario para errores de PHP.
~/.config/valet/Log/nginx-error.log Registro de usuario para errores de Nginx.
/usr/local/var/log/php-fpm.log Registro del sistema para errores de PHP-FPM.
/usr/local/var/log/nginx Contiene los registros de acceso y de errores de Nginx.
/usr/local/etc/php/X.X/conf.d Contiene archivos *.ini para varios ajustes de configuración de PHP.
/usr/local/etc/php/X.X/php-fpm.d/valet-fpm.conf Archivo de configuración del pool PHP-FPM.
~/.composer/vendor/laravel/valet/cli/stubs/secure.valet.conf La configuración predeterminada de Nginx utilizada para los certificados de obras.