Configurar entorno de desarrollo para Laravel en Linux

Publicado por: Antonio Serrano

Introducción

En este post vamos a aprender a configurar el entorno de desarrollo para trabajar con Laravel (Sistema operativo Linux), si no tienes un sistema operativo Linux puedes crear una maquina virtual, aquí te dejamos un video tutorial de como hacerlo. Yo te recomiendo instalar linux mint pero puedes elegir cualquier distribución Linux basada en Debian, y si tienes experiencia en sistemas linux puedes elegir la distribución que sea de tu agrado.


Los que vamos a realizar en esta ocasión es lo siguiente:

  • Instalación de PHP y paquetes.
  • Instalación y configuración de PotsgreSQL.
  • Instalación de composer
  • Instalación de node js y npm
  • Instalación y configuración de apache
  • Iniciar un proyecto laravel y crear un vhost

Antes de iniciar con la instalación de las herramientas necesarias vamos a realizar un update de nuesto sistema operativo, para esto ejecutaremos los siguientes comandos:  sudo apt update -y & sudo apt upgrade -y (En ambos nos pedirá introducir la contraseña).

jasv@tecnocode:~$ sudo apt update -y & sudo apt upgrade -y
[sudo] contraseña para jasv: ************

Instalación de PHP y paquetes

Durante este curso vamos a estar trabajando con Laravel en su versión 9, en su documentación oficial nos dice que necesitamos PHP 8.0 o superior, nosotros vamos a trabajar con PHP 8.1.

Instale las siguientes dependencias sudo apt install software-properties-common -y

jasv@tecnocode:~$ sudo apt install software-properties-common -y
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes NUEVOS:
  software-properties-common
0 actualizados, 1 nuevos se instalarán, 0 para eliminar y 0 no actualizados.
Se necesita descargar 9 136 B de archivos.
Se utilizarán 16.4 kB de espacio de disco adicional después de esta operación.
Des:1 http://packages.linuxmint.com una/upstream amd64 software-properties-common all 2.1.0 [9 136 B]
Descargados 9 136 B en 1s (10.8 kB/s)             
Seleccionando el paquete software-properties-common previamente no seleccionado.
(Leyendo la base de datos ... 361263 ficheros o directorios instalados actualmente.)
Preparando para desempaquetar .../software-properties-common_2.1.0_all.deb ...
Desempaquetando software-properties-common (2.1.0) ...
Configurando software-properties-common (2.1.0) ...
jasv@tecnocode:~$


Para instalar PHP 8.1 con éxito, deberá importar el PPA de renombre de Ondřej Surý, el desarrollador principal de PHP y Debian, y mantiene los paquetes de Ubuntu y Debian.

Instale los requisitos previos y Ondřej Surý PPA sudo add-apt-repository ppa:ondrej/php -y

jasv@tecnocode:~$ sudo add-apt-repository ppa:ondrej/php -y

Una vez hecho esto, es una buena idea actualizar sus repositorios APT ya que el PPA puede traer actualizaciones adicionales a las dependencias existentes.

jasv@tecnocode:~$ sudo apt update -y
jasv@tecnocode:~$ sudo apt upgrade -y

Ahora ejecutanos el comando sudo apt install php8.1 -y esto nos instalara en nuestro sistema PHP en su versión 8.1.

jasv@tecnocode:~$ sudo apt install php8.1 -y 


En la documentación oficial dentro de los requrimientos también nos dice que necesita algunos paquetes adicionales, estos los instalamos ejecutando el siguiente comando: sudo apt install php8.1-cli php8.1-fpm php8.1-common php8.1-mysql php8.1-zip php8.1-gd php8.1-mbstring php8.1-curl php8.1-xml php8.1-bcmath php8.1-pgsql php8.1-sqlite3

jasv@tecnocode:~$ sudo apt install php8.1-cli php8.1-fpm php8.1-common php8.1-mysql php8.1-zip php8.1-gd php8.1-mbstring php8.1-curl php8.1-xml php8.1-bcmath php8.1-pgsql php8.1-sqlite3
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
php8.1-cli ya está en su versión más reciente (8.1.3-1+ubuntu20.04.1+deb.sury.org+1).
fijado php8.1-cli como instalado manualmente.
php8.1-common ya está en su versión más reciente (8.1.3-1+ubuntu20.04.1+deb.sury.org+1).
fijado php8.1-common como instalado manualmente.
Se instalarán los siguientes paquetes adicionales:
  libonig5 libpq5 libzip4
Paquetes sugeridos:
  php-pear
Se instalarán los siguientes paquetes NUEVOS:
  libonig5 libpq5 libzip4 php8.1-bcmath php8.1-curl php8.1-fpm php8.1-gd php8.1-mbstring php8.1-mysql php8.1-pgsql php8.1-sqlite3
  php8.1-xml php8.1-zip
0 actualizados, 13 nuevos se instalarán, 0 para eliminar y 0 no actualizados.
Se necesita descargar 2 786 kB de archivos.
Se utilizarán 9 660 kB de espacio de disco adicional después de esta operación.
¿Desea continuar? [S/n]

Instalación y configuración de postgreSQL

Entre los manejadores de base de datos más conocidos se encuentran Mysql & PostreSQL, podemos conectar ambos con Laravel pero yo he decidido utilizar postgreSQL porque es mi preferido, además de ser el que utilizo más frecuentemente en mi día a día.

Para instalar postgreSQl en nuestro sistema ejecutamos el comando sudo apt install postgresql postgresql-contrib -y

jasv@tecnocode:~$ sudo apt install postgresql postgresql-contrib -y
[sudo] contraseña para jasv: ************


Una vez instalado postgreSQl debemos establecer una contraseña para el usuario postgres (o crear un nuevo usuario), para fines de este curso vamos a utilizar el usuario postgres con contraseña, lo primero que debemos hacer es ejecutar el comando sudo -u postgres psql postgres e instroducir la conteaseña del sistema.

Después ejecutaremos el comando \password postgres y nos pedira introducir la nueva contraseña en dos ocasiones, una vez establecida la contraseña ejecutaremos \q  para salir de la sesión postgres.

jasv@tecnocode:~$ sudo -u postgres psql postgres
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type "help" for help.
postgres=# \password postgres
Enter new password: 
Enter it again: 
postgres=# \q
jasv@tecnocode:~$ 


Después de establecer la contraseña debemos hacer cambios en el archivo de configuración de postgres  el cual se encuentra en la ruta /etc/postgresql/12/main/pg_hba.conf (en caso de tener una versión distinta de postgreSQl deberán cambiar /12/ por su versión. El archivo lo editaremos con el editor nano, ejecutamos el comando sudo nano /etc/postgresql/12/main/pg_hba.conf y replazamos la linea

local   all             postgres                                peer
por 
local   all             postgres                                md5

Una vez remplazado, presionamos Ctrl + o para gaurdar y damos enter, posteriormente presionamos Ctrl + x para salir de nano.



Si intentemos hacer login al usuario postgres con el comando psql -U postgres obtendremos un error, esto se debe porque debemos reiniciar el servicio de postgres para que los cambios surtan efecto, para eso ejecutamos sudo systemctl reload postgresql y después al ejecutar psql -U postgres nos pedira la contraseña que establecimos previamente para el usuario postgres.

jasv@tecnocode:~$ sudo systemctl reload postgresql
jasv@tecnocode:~$ psql -U postgres
Password for user postgres: 
psql (12.9 (Ubuntu 12.9-0ubuntu0.20.04.1))
Type "help" for help.
postgres=# \q
jasv@tecnocode:~$


Instalación de composer

Para crear proyectos de laravel, así como para instalar librerías extras dentro de nuestro proyecto laravel lo haremos mediante composer, como le menciona en la documentación oficial. Por esto necesitamos instarlo en nuestro sistema, para laravel 8 requerimos instalar la versión 2 de composer.

  1. Descargar Composer desde su Sitio Web Oficial wget getcomposer.org
  2. Hacer que el archivo Composer descargado sea ejecutable chmod +x ./composer.phar
  3. Cambir la ruta del archivo composer ejecutable para que sea fácilmente accesible sudo mv ./compositor.phar /usr/bin/compositor
  4. Verificar la instalación composer --version

jasv@tecnocode:~$ wget https://getcomposer.org/composer.phar
--2022-03-29 13:16:53--  https://getcomposer.org/composer.phar
Resolviendo getcomposer.org (getcomposer.org)... 142.44.245.229, 2607:5300:201:2100::4:d105
Conectando con getcomposer.org (getcomposer.org)[142.44.245.229]:443... conectado.
Petición HTTP enviada, esperando respuesta... 200 OK
Longitud: 2687602 (2.6M) [application/octet-stream]
Guardando como: “composer.phar” composer.phar 100%[==========================================================>] 2.56M 925KB/s en 2.8s 2022-03-29 13:16:56 (925 KB/s) - “composer.phar” guardado [2687602/2687602] jasv@tecnocode:~$ chmod +x ./composer.phar
jasv@tecnocode:~$ sudo mv ./composer.phar /usr/bin/composer
jasv@tecnocode:~$ composer --version Composer version 2.3-dev (2.3-dev+039701656ff06046fc148b4a3b23849f3b907e7f) 2022-03-29 16:58:23 jasv@tecnocode:~$

Instalación de node js y npm

Laravel utiliza laravel mix para compilar los assets (javascript, css, sass, etc.), así que necesitamos isntalar node y npm. Para este curso trabajaremos con la versión 12 de node y la versión 6 de npm, aunque podemos usar alguna superior y no debería darnos ningún problema, en ocasiones tenemos más de un proyecto y estos requieren distinta versión de node/npm, así que realizaremos la instalación de node con nvm, ya que este último nos permite cambiar fácilmente entre versiones de node instaladas en el sistema.

Instalamos nvm ejecutando el comando curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

jasv@tecnocode:~$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12819  100 12819    0     0  30521      0 --:--:-- --:--:-- --:--:-- 30521
=> Downloading nvm from git to '/home/jasv/.nvm'
=> Clonando en '/home/jasv/.nvm'...
remote: Enumerating objects: 267, done.
remote: Counting objects: 100% (267/267), done.
remote: Compressing objects: 100% (239/239), done.
remote: Total 267 (delta 30), reused 89 (delta 18), pack-reused 0
Recibiendo objetos: 100% (267/267), 119.57 KiB | 755.00 KiB/s, listo.
Resolviendo deltas: 100% (30/30), listo.
=> Compressing and cleaning up git repository
=> Appending nvm source string to /home/jasv/.bashrc
=> Appending bash_completion source string to /home/jasv/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
jasv@tecnocode:~$ 


Existen algunos comandos básicos para trabajar con nvm, los cuales son: 

        • nvm list: Permite listar todas las versiones instaladas en tu sistema.
        • nvm ls-remote --lts: Permite listar todas las versiones LTS disponibles para descargar desde los repositorios oficiales de Node. Si utilizan el comando sin el flag --lts, NVM listará todas las versiones disponibles de Node.
        • nvm install <VERSIÓN>: Permite instalar una versión en específico. Una vez ha finalizado la instalación, NVM automáticamente cambiará la versión a la última descargada.

        Ejecutamos nvm ls-remote --lts y nos listará todas las versiones lts disponibles para descargar. Nosotros isntalaremos la versión 12.22.11 ejecutamos el comando nvm install v12.22.11 una vez descargado e instalamos ejecutamos node -v & npm -v para verificar las versiones instaladas.

        jasv@tecnocode:~$ nvm install v12.22.11
        Downloading and installing node v12.22.11...
        Downloading https://nodejs.org/dist/v12.22.11/node-v12.22.11-linux-x64.tar.xz...
        ############################################################################################################################# 100.0%
        Computing checksum with sha256sum
        Checksums matched!
        Now using node v12.22.11 (npm v6.14.16)
        Creating default alias: default -> v12.22.11
        jasv@tecnocode:~$ node -v & npm -v
        [1] 32436
        v12.22.11
        6.14.16
        [1]+  Hecho                   node -v
        jasv@tecnocode:~$


        Instalación y configuración de apache

        Si bien podemos utilizar php artisan serve para correr una aplicación laravel, en mi opinión me resulta más practico tener un virtual host local, esto lo podemos lograr con apache o nginx, yo prefiero apache para entorno local y nginx para producción. Así que instalaremos apache ejecutando el comando.

        Ejecutamos el comando sudo apt install apache2 -y si no tenemos apache se nos instalará, posteriormente debemos habilitar el modo rewrite, ejecutamos sudo a2enmod rewrite y finalmente ejecutamos sudo systemctl restart apache2 para reiniciar el servicio de apache y nuestros cambios tengan efecto.

        jasv@tecnocode:~$ sudo apt install apache2 -y 
        [sudo] contraseña para jasv:             
        Leyendo lista de paquetes... Hecho
        Creando árbol de dependencias       
        Leyendo la información de estado... Hecho
        apache2 ya está en su versión más reciente (2.4.41-4ubuntu3.10).
        fijado apache2 como instalado manualmente.
        0 actualizados, 0 nuevos se instalarán, 0 para eliminar y 2 no actualizados.
        jasv@tecnocode:~$ sudo a2enmod rewrite Enabling module rewrite. To activate the new configuration, you need to run: systemctl restart apache2 jasv@tecnocode:~/www/cursolaravel$ sudo systemctl reload apache2.service jasv@tecnocode:~/www/cursolaravel$


        Ahora si en nuestro navegador favorito ingresamos a la url http://localhost/ debemos ver la página de apache.



        Crear un proyecto laravel

        Como mencionamos anteriormente vamos a estar trabajando este curso con un vhost de apache en nuestra maquina local, por esa razón recomiendo crear una carpeta llamada www dentro de la carpeta de usuario en Linux, para hacer esto ejecutamos el comando cd /home/<usuario> (remplazamos <usuario> por nuestro usuario de sistema, presionamos enter y una vez ahí ejecutamos mkdir www para crear la carpeta. Enseguida ejecutamos cd www para acceder a la carpeta que recién creamos.

        Una vez dentro de la carpeta www ejecutamos el comando composer create-project laravel/laravel <nombre-proyecto> remplazando <nombre proyecto> por el nombre de nuestra agrado, en mi casa usare cursolaravel así que el  comando final sería  composer create-project laravel/laravel cursolaravel

        jasv@tecnocode:~$ cd /home/jasv/
        jasv@tecnocode:~$ mkdir www
        jasv@tecnocode:~$ cd www/
        jasv@tecnocode:~/www$ composer create-project laravel/laravel cursolaravel
        Creating a "laravel/laravel" project at "./cursolaravel"
        Info from https://repo.packagist.org: #StandWithUkraine
        Installing laravel/laravel (v9.1.3)
          - Downloading laravel/laravel (v9.1.3)
          - Installing laravel/laravel (v9.1.3): Extracting archive
        Created project in /home/jasv/www/cursolaravel
        > @php -r "file_exists('.env') || copy('.env.example', '.env');"
        Loading composer repositories with package information
        Updating dependencies
        Lock file operations: 108 installs, 0 updates, 0 removals
          - Locking brick/math (0.9.3)
          - Locking dflydev/dot-access-data (v3.0.1)
          - Locking doctrine/inflector (2.0.4)
          - Locking doctrine/instantiator (1.4.1)
          - Locking doctrine/lexer (1.2.3)
          - Locking dragonmantank/cron-expression (v3.3.1)
          - Locking egulias/email-validator (3.1.2)
          - Locking facade/ignition-contracts (1.0.2)
          - Locking fakerphp/faker (v1.19.0)
          - Locking filp/whoops (2.14.5)
          - Locking fruitcake/php-cors (v1.2.0)
          - Locking graham-campbell/result-type (v1.0.4)
          - Locking guzzlehttp/guzzle (7.4.2)
          - Locking guzzlehttp/promises (1.5.1)
          - Locking guzzlehttp/psr7 (2.2.1)
          - Locking hamcrest/hamcrest-php (v2.0.1)
          - Locking laravel/framework (v9.6.0)
          - Locking laravel/sail (v1.13.8)
          - Locking laravel/sanctum (v2.15.0)
          - Locking laravel/serializable-closure (v1.1.1)
          - Locking laravel/tinker (v2.7.2)
          - Locking league/commonmark (2.2.3)
          - Locking league/config (v1.1.1)
          - Locking league/flysystem (3.0.12)
          - Locking league/mime-type-detection (1.9.0)
          - Locking mockery/mockery (1.5.0)
          - Locking monolog/monolog (2.4.0)
          - Locking myclabs/deep-copy (1.11.0)
          - Locking nesbot/carbon (2.57.0)
          - Locking nette/schema (v1.2.2)
          - Locking nette/utils (v3.2.7)
          - Locking nikic/php-parser (v4.13.2)
          - Locking nunomaduro/collision (v6.1.0)
          - Locking phar-io/manifest (2.0.3)
          - Locking phar-io/version (3.2.1)
          - Locking phpdocumentor/reflection-common (2.2.0)
          - Locking phpdocumentor/reflection-docblock (5.3.0)
          - Locking phpdocumentor/type-resolver (1.6.1)
          - Locking phpoption/phpoption (1.8.1)
          - Locking phpspec/prophecy (v1.15.0)
          - Locking phpunit/php-code-coverage (9.2.15)
          - Locking phpunit/php-file-iterator (3.0.6)
          - Locking phpunit/php-invoker (3.1.1)
          - Locking phpunit/php-text-template (2.0.4)
          - Locking phpunit/php-timer (5.0.3)
          - Locking phpunit/phpunit (9.5.19)
          - Locking psr/container (2.0.2)
          - Locking psr/event-dispatcher (1.0.0)
          - Locking psr/http-client (1.0.1)
          - Locking psr/http-factory (1.0.1)
          - Locking psr/http-message (1.0.1)
          - Locking psr/log (3.0.0)
          - Locking psr/simple-cache (3.0.0)
          - Locking psy/psysh (v0.11.2)
          - Locking ralouphie/getallheaders (3.0.3)
          - Locking ramsey/collection (1.2.2)
          - Locking ramsey/uuid (4.3.1)
          - Locking sebastian/cli-parser (1.0.1)
          - Locking sebastian/code-unit (1.0.8)
          - Locking sebastian/code-unit-reverse-lookup (2.0.3)
          - Locking sebastian/comparator (4.0.6)
          - Locking sebastian/complexity (2.0.2)
          - Locking sebastian/diff (4.0.4)
          - Locking sebastian/environment (5.1.3)
          - Locking sebastian/exporter (4.0.4)
          - Locking sebastian/global-state (5.0.5)
          - Locking sebastian/lines-of-code (1.0.3)
          - Locking sebastian/object-enumerator (4.0.4)
          - Locking sebastian/object-reflector (2.0.4)
          - Locking sebastian/recursion-context (4.0.4)
          - Locking sebastian/resource-operations (3.0.3)
          - Locking sebastian/type (3.0.0)
          - Locking sebastian/version (3.0.2)
          - Locking spatie/backtrace (1.2.1)
          - Locking spatie/flare-client-php (1.1.0)
          - Locking spatie/ignition (1.2.7)
          - Locking spatie/laravel-ignition (1.1.1)
          - Locking symfony/console (v6.0.5)
          - Locking symfony/css-selector (v6.0.3)
          - Locking symfony/deprecation-contracts (v3.0.0)
          - Locking symfony/error-handler (v6.0.3)
          - Locking symfony/event-dispatcher (v6.0.3)
          - Locking symfony/event-dispatcher-contracts (v3.0.0)
          - Locking symfony/finder (v6.0.3)
          - Locking symfony/http-foundation (v6.0.6)
          - Locking symfony/http-kernel (v6.0.6)
          - Locking symfony/mailer (v6.0.5)
          - Locking symfony/mime (v6.0.3)
          - Locking symfony/polyfill-ctype (v1.25.0)
          - Locking symfony/polyfill-intl-grapheme (v1.25.0)
          - Locking symfony/polyfill-intl-idn (v1.25.0)
          - Locking symfony/polyfill-intl-normalizer (v1.25.0)
          - Locking symfony/polyfill-mbstring (v1.25.0)
          - Locking symfony/polyfill-php72 (v1.25.0)
          - Locking symfony/polyfill-php80 (v1.25.0)
          - Locking symfony/polyfill-php81 (v1.25.0)
          - Locking symfony/process (v6.0.5)
          - Locking symfony/routing (v6.0.5)
          - Locking symfony/service-contracts (v3.0.0)
          - Locking symfony/string (v6.0.3)
          - Locking symfony/translation (v6.0.6)
          - Locking symfony/translation-contracts (v3.0.0)
          - Locking symfony/var-dumper (v6.0.6)
          - Locking theseer/tokenizer (1.2.1)
          - Locking tijsverkoyen/css-to-inline-styles (2.2.4)
          - Locking vlucas/phpdotenv (v5.4.1)
          - Locking voku/portable-ascii (2.0.1)
          - Locking webmozart/assert (1.10.0)
        Writing lock file
        Installing dependencies from lock file (including require-dev)
        Package operations: 108 installs, 0 updates, 0 removals
          - Downloading doctrine/inflector (2.0.4)
          - Downloading doctrine/lexer (1.2.3)
          - Downloading symfony/polyfill-ctype (v1.25.0)
          - Downloading webmozart/assert (1.10.0)
          - Downloading dragonmantank/cron-expression (v3.3.1)
          - Downloading symfony/deprecation-contracts (v3.0.0)
          - Downloading psr/container (2.0.2)
          - Downloading fakerphp/faker (v1.19.0)
          - Downloading symfony/polyfill-mbstring (v1.25.0)
          - Downloading symfony/http-foundation (v6.0.6)
          - Downloading fruitcake/php-cors (v1.2.0)
          - Downloading psr/http-message (1.0.1)
          - Downloading psr/http-client (1.0.1)
          - Downloading ralouphie/getallheaders (3.0.3)
          - Downloading psr/http-factory (1.0.1)
          - Downloading guzzlehttp/psr7 (2.2.1)
          - Downloading guzzlehttp/promises (1.5.1)
          - Downloading guzzlehttp/guzzle (7.4.2)
          - Downloading voku/portable-ascii (2.0.1)
          - Downloading symfony/polyfill-php80 (v1.25.0)
          - Downloading phpoption/phpoption (1.8.1)
          - Downloading graham-campbell/result-type (v1.0.4)
          - Downloading vlucas/phpdotenv (v5.4.1)
          - Downloading symfony/css-selector (v6.0.3)
          - Downloading tijsverkoyen/css-to-inline-styles (2.2.4)
          - Downloading symfony/var-dumper (v6.0.6)
          - Downloading symfony/routing (v6.0.5)
          - Downloading symfony/process (v6.0.5)
          - Downloading symfony/polyfill-php72 (v1.25.0)
          - Downloading symfony/polyfill-intl-normalizer (v1.25.0)
          - Downloading symfony/polyfill-intl-idn (v1.25.0)
          - Downloading symfony/mime (v6.0.3)
          - Downloading symfony/service-contracts (v3.0.0)
          - Downloading psr/event-dispatcher (1.0.0)
          - Downloading symfony/event-dispatcher-contracts (v3.0.0)
          - Downloading symfony/event-dispatcher (v6.0.3)
          - Downloading psr/log (3.0.0)
          - Downloading egulias/email-validator (3.1.2)
          - Downloading symfony/mailer (v6.0.5)
          - Downloading symfony/error-handler (v6.0.3)
          - Downloading symfony/http-kernel (v6.0.6)
          - Downloading symfony/finder (v6.0.3)
          - Downloading symfony/polyfill-intl-grapheme (v1.25.0)
          - Downloading symfony/string (v6.0.3)
          - Downloading symfony/console (v6.0.5)
          - Downloading symfony/polyfill-php81 (v1.25.0)
          - Downloading ramsey/collection (1.2.2)
          - Downloading brick/math (0.9.3)
          - Downloading ramsey/uuid (4.3.1)
          - Downloading psr/simple-cache (3.0.0)
          - Downloading symfony/translation-contracts (v3.0.0)
          - Downloading symfony/translation (v6.0.6)
          - Downloading nesbot/carbon (2.57.0)
          - Downloading monolog/monolog (2.4.0)
          - Downloading league/mime-type-detection (1.9.0)
          - Downloading league/flysystem (3.0.12)
          - Downloading nette/utils (v3.2.7)
          - Downloading nette/schema (v1.2.2)
          - Downloading dflydev/dot-access-data (v3.0.1)
          - Downloading league/config (v1.1.1)
          - Downloading league/commonmark (2.2.3)
          - Downloading laravel/serializable-closure (v1.1.1)
          - Downloading laravel/framework (v9.6.0)
          - Downloading laravel/sail (v1.13.8)
          - Downloading laravel/sanctum (v2.15.0)
          - Downloading nikic/php-parser (v4.13.2)
          - Downloading psy/psysh (v0.11.2)
          - Downloading laravel/tinker (v2.7.2)
          - Downloading hamcrest/hamcrest-php (v2.0.1)
          - Downloading mockery/mockery (1.5.0)
          - Downloading filp/whoops (2.14.5)
          - Downloading facade/ignition-contracts (1.0.2)
          - Downloading nunomaduro/collision (v6.1.0)
          - Downloading phpdocumentor/reflection-common (2.2.0)
          - Downloading phpdocumentor/type-resolver (1.6.1)
          - Downloading phpdocumentor/reflection-docblock (5.3.0)
          - Downloading sebastian/version (3.0.2)
          - Downloading sebastian/type (3.0.0)
          - Downloading sebastian/resource-operations (3.0.3)
          - Downloading sebastian/recursion-context (4.0.4)
          - Downloading sebastian/object-reflector (2.0.4)
          - Downloading sebastian/object-enumerator (4.0.4)
          - Downloading sebastian/global-state (5.0.5)
          - Downloading sebastian/exporter (4.0.4)
          - Downloading sebastian/environment (5.1.3)
          - Downloading sebastian/diff (4.0.4)
          - Downloading sebastian/comparator (4.0.6)
          - Downloading sebastian/code-unit (1.0.8)
          - Downloading sebastian/cli-parser (1.0.1)
          - Downloading phpunit/php-timer (5.0.3)
          - Downloading phpunit/php-text-template (2.0.4)
          - Downloading phpunit/php-invoker (3.1.1)
          - Downloading phpunit/php-file-iterator (3.0.6)
          - Downloading theseer/tokenizer (1.2.1)
          - Downloading sebastian/lines-of-code (1.0.3)
          - Downloading sebastian/complexity (2.0.2)
          - Downloading sebastian/code-unit-reverse-lookup (2.0.3)
          - Downloading phpunit/php-code-coverage (9.2.15)
          - Downloading doctrine/instantiator (1.4.1)
          - Downloading phpspec/prophecy (v1.15.0)
          - Downloading phar-io/version (3.2.1)
          - Downloading phar-io/manifest (2.0.3)
          - Downloading myclabs/deep-copy (1.11.0)
          - Downloading phpunit/phpunit (9.5.19)
          - Downloading spatie/backtrace (1.2.1)
          - Downloading spatie/flare-client-php (1.1.0)
          - Downloading spatie/ignition (1.2.7)
          - Downloading spatie/laravel-ignition (1.1.1)
          - Installing doctrine/inflector (2.0.4): Extracting archive
          - Installing doctrine/lexer (1.2.3): Extracting archive
          - Installing symfony/polyfill-ctype (v1.25.0): Extracting archive
          - Installing webmozart/assert (1.10.0): Extracting archive
          - Installing dragonmantank/cron-expression (v3.3.1): Extracting archive
          - Installing symfony/deprecation-contracts (v3.0.0): Extracting archive
          - Installing psr/container (2.0.2): Extracting archive
          - Installing fakerphp/faker (v1.19.0): Extracting archive
          - Installing symfony/polyfill-mbstring (v1.25.0): Extracting archive
          - Installing symfony/http-foundation (v6.0.6): Extracting archive
          - Installing fruitcake/php-cors (v1.2.0): Extracting archive
          - Installing psr/http-message (1.0.1): Extracting archive
          - Installing psr/http-client (1.0.1): Extracting archive
          - Installing ralouphie/getallheaders (3.0.3): Extracting archive
          - Installing psr/http-factory (1.0.1): Extracting archive
          - Installing guzzlehttp/psr7 (2.2.1): Extracting archive
          - Installing guzzlehttp/promises (1.5.1): Extracting archive
          - Installing guzzlehttp/guzzle (7.4.2): Extracting archive
          - Installing voku/portable-ascii (2.0.1): Extracting archive
          - Installing symfony/polyfill-php80 (v1.25.0): Extracting archive
          - Installing phpoption/phpoption (1.8.1): Extracting archive
          - Installing graham-campbell/result-type (v1.0.4): Extracting archive
          - Installing vlucas/phpdotenv (v5.4.1): Extracting archive
          - Installing symfony/css-selector (v6.0.3): Extracting archive
          - Installing tijsverkoyen/css-to-inline-styles (2.2.4): Extracting archive
          - Installing symfony/var-dumper (v6.0.6): Extracting archive
          - Installing symfony/routing (v6.0.5): Extracting archive
          - Installing symfony/process (v6.0.5): Extracting archive
          - Installing symfony/polyfill-php72 (v1.25.0): Extracting archive
          - Installing symfony/polyfill-intl-normalizer (v1.25.0): Extracting archive
          - Installing symfony/polyfill-intl-idn (v1.25.0): Extracting archive
          - Installing symfony/mime (v6.0.3): Extracting archive
          - Installing symfony/service-contracts (v3.0.0): Extracting archive
          - Installing psr/event-dispatcher (1.0.0): Extracting archive
          - Installing symfony/event-dispatcher-contracts (v3.0.0): Extracting archive
          - Installing symfony/event-dispatcher (v6.0.3): Extracting archive
          - Installing psr/log (3.0.0): Extracting archive
          - Installing egulias/email-validator (3.1.2): Extracting archive
          - Installing symfony/mailer (v6.0.5): Extracting archive
          - Installing symfony/error-handler (v6.0.3): Extracting archive
          - Installing symfony/http-kernel (v6.0.6): Extracting archive
          - Installing symfony/finder (v6.0.3): Extracting archive
          - Installing symfony/polyfill-intl-grapheme (v1.25.0): Extracting archive
          - Installing symfony/string (v6.0.3): Extracting archive
          - Installing symfony/console (v6.0.5): Extracting archive
          - Installing symfony/polyfill-php81 (v1.25.0): Extracting archive
          - Installing ramsey/collection (1.2.2): Extracting archive
          - Installing brick/math (0.9.3): Extracting archive
          - Installing ramsey/uuid (4.3.1): Extracting archive
          - Installing psr/simple-cache (3.0.0): Extracting archive
          - Installing symfony/translation-contracts (v3.0.0): Extracting archive
          - Installing symfony/translation (v6.0.6): Extracting archive
          - Installing nesbot/carbon (2.57.0): Extracting archive
          - Installing monolog/monolog (2.4.0): Extracting archive
          - Installing league/mime-type-detection (1.9.0): Extracting archive
          - Installing league/flysystem (3.0.12): Extracting archive
          - Installing nette/utils (v3.2.7): Extracting archive
          - Installing nette/schema (v1.2.2): Extracting archive
          - Installing dflydev/dot-access-data (v3.0.1): Extracting archive
          - Installing league/config (v1.1.1): Extracting archive
          - Installing league/commonmark (2.2.3): Extracting archive
          - Installing laravel/serializable-closure (v1.1.1): Extracting archive
          - Installing laravel/framework (v9.6.0): Extracting archive
          - Installing laravel/sail (v1.13.8): Extracting archive
          - Installing laravel/sanctum (v2.15.0): Extracting archive
          - Installing nikic/php-parser (v4.13.2): Extracting archive
          - Installing psy/psysh (v0.11.2): Extracting archive
          - Installing laravel/tinker (v2.7.2): Extracting archive
          - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive
          - Installing mockery/mockery (1.5.0): Extracting archive
          - Installing filp/whoops (2.14.5): Extracting archive
          - Installing facade/ignition-contracts (1.0.2): Extracting archive
          - Installing nunomaduro/collision (v6.1.0): Extracting archive
          - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
          - Installing phpdocumentor/type-resolver (1.6.1): Extracting archive
          - Installing phpdocumentor/reflection-docblock (5.3.0): Extracting archive
          - Installing sebastian/version (3.0.2): Extracting archive
          - Installing sebastian/type (3.0.0): Extracting archive
          - Installing sebastian/resource-operations (3.0.3): Extracting archive
          - Installing sebastian/recursion-context (4.0.4): Extracting archive
          - Installing sebastian/object-reflector (2.0.4): Extracting archive
          - Installing sebastian/object-enumerator (4.0.4): Extracting archive
          - Installing sebastian/global-state (5.0.5): Extracting archive
          - Installing sebastian/exporter (4.0.4): Extracting archive
          - Installing sebastian/environment (5.1.3): Extracting archive
          - Installing sebastian/diff (4.0.4): Extracting archive
          - Installing sebastian/comparator (4.0.6): Extracting archive
          - Installing sebastian/code-unit (1.0.8): Extracting archive
          - Installing sebastian/cli-parser (1.0.1): Extracting archive
          - Installing phpunit/php-timer (5.0.3): Extracting archive
          - Installing phpunit/php-text-template (2.0.4): Extracting archive
          - Installing phpunit/php-invoker (3.1.1): Extracting archive
          - Installing phpunit/php-file-iterator (3.0.6): Extracting archive
          - Installing theseer/tokenizer (1.2.1): Extracting archive
          - Installing sebastian/lines-of-code (1.0.3): Extracting archive
          - Installing sebastian/complexity (2.0.2): Extracting archive
          - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
          - Installing phpunit/php-code-coverage (9.2.15): Extracting archive
          - Installing doctrine/instantiator (1.4.1): Extracting archive
          - Installing phpspec/prophecy (v1.15.0): Extracting archive
          - Installing phar-io/version (3.2.1): Extracting archive
          - Installing phar-io/manifest (2.0.3): Extracting archive
          - Installing myclabs/deep-copy (1.11.0): Extracting archive
          - Installing phpunit/phpunit (9.5.19): Extracting archive
          - Installing spatie/backtrace (1.2.1): Extracting archive
          - Installing spatie/flare-client-php (1.1.0): Extracting archive
          - Installing spatie/ignition (1.2.7): Extracting archive
          - Installing spatie/laravel-ignition (1.1.1): Extracting archive
        64 package suggestions were added by new dependencies, use `composer suggest` to see details.
        Generating optimized autoload files
        > Illuminate\Foundation\ComposerScripts::postAutoloadDump
        > @php artisan package:discover --ansi
        Discovered Package: laravel/sail
        Discovered Package: laravel/sanctum
        Discovered Package: laravel/tinker
        Discovered Package: nesbot/carbon
        Discovered Package: nunomaduro/collision
        Discovered Package: spatie/laravel-ignition
        Package manifest generated successfully.
        78 packages you are using are looking for funding.
        Use the `composer fund` command to find out more!
        > @php artisan vendor:publish --tag=laravel-assets --ansi --force
        No publishable resources for tag [laravel-assets].
        Publishing complete.
        > @php artisan key:generate --ansi
        Application key set successfully.
        jasv@tecnocode:~/www$ 


        Una vez que el proyecto se ha creado accedemos a la carpeta de proyecto, en este caso llamada cursolaravel con el comando cd cursolaravel y una vez dentro es necesario dar unos permisos de escritura y lectura a unas carpetas del proyecto, para eso ejecutamos lo siguientes comandos

        • sudo chgrp -R www-data storage bootstrap/cache
        • sudo chmod -R ug+rwx storage bootstrap/cache

        Ahora debemos crear el archivo .env de nuestro proyecto (En este archivo debemos agregar el nombre del proyecto, los datos para conexión a base de datos) entre otras cosas que necesitaremos en el futuro, laravel nos da un archivo llamada .env.example así que por el momento ejecutamos el comando cp .env.example .env para copiar ese archivo pero con el nombre .env

        Una vez que que hemos generado el archivo .env ejecutaremos php artisan key:generate este comando nos genera el key de la apliación (lo debemos hacer cada que creemos un nuevo proyecto o cada que montemos una nueva instancia de nuestro proyecto.

        jasv@tecnocode:~/www$ cd cursolaravel/
        jasv@tecnocode:~/www/cursolaravel$ sudo chgrp -R www-data storage bootstrap/cache
        [sudo] contraseña para jasv:             
        jasv@tecnocode:~/www/cursolaravel$ sudo chmod -R ug+rwx storage bootstrap/cache
        jasv@tecnocode:~/www/cursolaravel$ cp .env.example .env
        jasv@tecnocode:~/www/cursolaravel$ php artisan key:generate
        Application key set successfully.
        jasv@tecnocode:~/www/cursolaravel$


        Si ahora ejecutamos php artisan serve obtendremos una url donde podemos ver el proyecto, pero yo prefieron crear un virtual host, como lo haremos a continuación.

        jasv@tecnocode:~/www/cursolaravel$ php artisan serve
        Starting Laravel development server: http://127.0.0.1:8000
        [Tue Mar 29 14:51:52 2022] PHP 8.1.3 Development Server (http://127.0.0.1:8000) started


        Crear vhost en apache

        Creamos un archivo llamado site.conf dentro de la ruta /etc/apache2/sites-available (yo he decidido nombrarlo site.conf pero podemos darle cualquier nombre, solo ten en cuenta que en los pasos siguientes si cambias el nombre deberas remplazar site con el nombre que le hayas dado), para crear el archivo ejecutamos el comando sudo nano /etc/apache2/sites-available/site.conf y dentro de ese archivo pegamos el siguiente código:

        <VirtualHost *:80>
                ServerName curso.laravel.local
                ServerAdmin webmaster@localhost
                DocumentRoot /home/jasv/www/cursolaravel/public
                <Location />
                    Require all granted
                </Location>
                <Directory /home/jasv/www/cursolaravel/public>
                    Options FollowSymLinks
                    AllowOverride All
                    Require all granted
                </Directory>
                ErrorLog ${APACHE_LOG_DIR}/curso.laravel-error.log
                CustomLog ${APACHE_LOG_DIR}/curso.laravel-access.log combined
        </VirtualHost>
        • La etiqueta <VirtualHost *:80> nos indica que es el host virtual escuchado mediante el puerto 80, es decir que funcionará con el protocolo http
        • ServerName nos indica el nombre del host vitual, por ejemplo yo lo he nombrado curso.laravel.local por lo que para acceder por medio del navegador lo haré escribiendo http://curso.laravel.local
        • DocumentRoot y Directory es la carpeta a la cual apunta nuestro host virtual, en este caso al ser un proyecto laravel lo debemos apuntar a la carpeta public de nuestro proyecto que creamos anteriormente, en mi caso mi proyecto se llama cursolaravel y se encuentra dentro de una carpeta llamada www, la cual se encuentra en nuestro directorio de usuario, por lo tanto mi ruta es /home/tecnocode/www/cursolaravel/public, si has utilizado los mismos nombres que yo durante el tutorial tu url debería verse de la siguiente manera /home/<usuario>/www/cursolaravel/public donde <usuario> es tu nombre de usuario.

        Presionamos Ctrl + o seguido de enter para guardar los cambios en el archivo, y después Ctrl + x para salir del editor nano.


        Ahora debemos crear un enlace simbolico de nuestro host virtual para eso ejecutamos el comando sudo a2ensite site.conf

        jasv@tecnocode:~/www/cursolaravel$ sudo nano /etc/apache2/sites-available/site.conf
        jasv@tecnocode:~/www/cursolaravel$ sudo a2ensite site.conf 
        Enabling site site.
        To activate the new configuration, you need to run:
          systemctl reload apache2
        jasv@tecnocode:~/www/cursolaravel$


        Ahora debemos agregar el nombre de nuestro host virtual al archivo de hosts de nuestro sistema, en el caso de linux este archivo es /etc/hosts así que ejecutamos sudo nano /etc/hosts y después de la primer linea gregaremos: 

        127.0.0.1       curso.laravel.local en donde curso.laravel.local es el nombre de nuestro host virtual.



        Presionamos Ctrl + o seguido de enter para guardar los cambios en el archivo, y después Ctrl + x para salir del editor nano. Ahora debemos reiniciar apache para que nuestros cambios se vean reflejados, así que ejecutamos sudo systemctl restart apache2 

        jasv@tecnocode:~/www/cursolaravel$ sudo nano /etc/hosts
        jasv@tecnocode:~/www/cursolaravel$ sudo systemctl reload apache2.service 
        jasv@tecnocode:~/www/cursolaravel


        Una vez hecho esto y si en nuestro navegador favorito  escribimos la url http://curso.laravel.local veremos la página de presentación de laravel, la cuál es nuestro proyecto laravel recién creado.



        ¡FELICIDADES! Has creado tu primer proyecto laravel y tu primer host virtual.

        En nuestras siguientes entregas abarcaremos los temas de: configuración inicial, rutas, vistas y controladores por lo que necesitaremos un editor de código, puedes usar el de tu preferencia pero yo te recomiendo Visual Studio Code, a continuación te dejo un video para que lo instales.


        Recuerda que si quieres recibir notificaciones vía correo electrónico cuando se publique una nueva entrega del curso, puedes registrarte, ¡Es gratis!

        Compartir

        0 Comentarios

        0