Extensiones para ayudarte a programar en Laravel

DE USO COMUN

Laravel Debugbar
Una barra de estado con mucha información
https://github.com/barryvdh/laravel-debugbar

composer require barryvdh/laravel-debugbar --dev

browserSync
Esta es una extensión de webpack para que se refresque automáticamente el navegador cada vez que hagamos un cambio (necesitamos correr también «npm run watch»)
Después de instalar Node

npm install

Debemos añadir al «mix» este código en el fichero webpack.mix.js de la raiz del proyecto:

    .browserSync({
        proxy: 'tu.dominio',
        files: ['app/**/*.php', 'resources/lang/**/*', 'resources/views/**/*.php', 'routes/**/*.php', 'public/js/*.js', 'public/css/*.css', 'public/img/*']
    });

BASE DE DATOS

Eloquent Model Generator
Generar un modelo en base a una tabla ya hecha
https://github.com/krlove/eloquent-model-generator

composer require krlove/eloquent-model-generator --dev

Un ejemplo de uso seria:

php artisan krlove:generate:model ElModelo --table-name=LaTabla  --output-path=/var/www/carpeta_proyecto/app/Models --namespace=App\\Models


Laravel Migrations Generator

Generar una migración de una base de datos ya existente, puede ser de tablas individuales
https://github.com/kitloong/laravel-migrations-generator

composer require --dev "kitloong/laravel-migrations-generator"

Un ejemplo de usop seria:

php artisan migrate:generate --tables="tabla1,tabla2,tabla3"

TRADUCCIONES

Translatable String Exporter for Laravel
Encuentra las traducciones y las pone en el fichero (de __(«») al fichero) preparándolo para traducir
https://github.com/kkomelin/laravel-translatable-string-exporter

composer require kkomelin/laravel-translatable-string-exporter

laravel-google-translate
Traduce los ficheros via Google, con la anterior extensión es un dúo perfecto (necesitas API key de google)
https://github.com/tanmuhittin/laravel-google-translate

composer require tanmuhittin/laravel-google-translate
php artisan vendor:publish --provider="Tanmuhittin\LaravelGoogleTranslate\LaravelGoogleTranslateServiceProvider"

USOS CONCRETOS

PhpSpreadsheet
Para manejar el EXCEL
https://github.com/PHPOffice/PhpSpreadsheet

composer require phpoffice/phpspreadsheet

Multilenguaje en Laravel

Crear un middleware llamado por ejemplo «SetLocaleUrl»:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\URL;
use DB;
use Carbon\Carbon;

class SetLocaleUrl
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $locale = $request->segment(1);
        $languages = config('app.locales');
        if ( !in_array($locale, $languages)) {
            $locale = config('app.fallback_locale');
        }
        app()->setLocale($locale);
        Carbon::setLocale($locale);
        switch($locale) {
            case 'ca':
                Carbon::setUtf8(false);
                setlocale(LC_ALL, 'ca_ES.UTF-8', 'Catalan_Spain', 'Catalan');
                DB::statement("SET lc_time_names = 'ca_ES'");
            break;
            case 'es':
                Carbon::setUtf8(false);
                setlocale(LC_ALL, 'es_ES.UTF-8', 'Spanish_Spain', 'Spanish');
                DB::statement("SET lc_time_names = 'es_ES'");
            break;
        }
        URL::defaults(['locale' => app()->getLocale()]);

        return $next($request);
    }
}

el «lc_time_names» es para las fechas en mysql, etc…

Registrar el middleware en el kernel.php

    protected $routeMiddleware = [
        ...
        'SetLocaleUrl' => \App\Http\Middleware\SetLocaleUrl::class,

    ];

Modificar las rutas, añadiendo una para redirigir al lenguaje por defecto:

Route::get('/', function () {
    return redirect(app()->getLocale());
});

Y el grupo de las rutas con lenguaje

Route::group([
    'prefix' => '{locale}',
    'where' => ['locale' => '[a-zA-Z]{2}'],
    'middleware' => 'SetLocaleUrl'
], function() {
    //localized routes
        ...

});

Si usamos autentificación, modificamos la ruta del middleware Authenticate:

        ...
return route('login', app()->getLocale());
        ...

});

Y también añadiremos la ruta para redirigir después de un login válido. Para ello debemos modificar el fichero Login del directorio «Auth». En mi caso sacaremos el idioma de la base de datos, del campo (añadido) «locale» del usuario:

    public function redirectTo()  {
        $idioma = Auth::user()->locale;
        return $idioma.'/admin';
    }

Crear un proyecto Laravel 8 con autentificación para php 7.4

Primero necesitas montar el entorno de desarrollo con Apache, Mysql, etc puede que te interese leer esto. Seguidamente para crear un proyecto en laravel 8 seguiremos estos pasos:

Lo primero que hay que hacer es instalar composer:

sudo apt install composer

O tambien puedes descargarlo e instalarlo desde aquí, si quieres (hay versión Windows)

https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx

sudo apt install curl php-cli unzip php-zip
cd /tmp
curl -sS https://getcomposer.org/installer -o composer-setup.php
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer
sudo nano ~/.bashrc

y añadir al final de .bachrc

export PATH="$HOME/.config/composer/vendor/bin:$PATH"

para luego recargar los cambios

source ~/.bashrc

Si ya lo tienes instalado puedes asegurarte que este actualizado con:

composer self-update

Instalamos el instalador de Laravel propiamente dicho:

composer global require «laravel/installer»

Luego creamos nuestro proyecto, debemos tener instalado php 7.4 al menos para no tener errores:

composer create-project laravel/laravel="8.*" proyecto --prefer-dist 

Yo tuve que instalar las extensiones php7.4-xml y php7.4-mbstring

sudo apt install php7.4-mbstring
sudo apt install php7.4-xml

Tienes aquí varias opcionmes, la primera que te expongo es con breeze (tailwind):

composer require laravel/breeze --dev
php artisan breeze:install
npm install && npm run dev

La segunda es con bootstrap:

composer require laravel/ui
php artisan ui --auth
php artisan ui bootstrap --auth
npm install && npm run dev

Como no podemos escoger en que directorio apunta nuestro dominio, no podemos apuntar al directorio «public» crearemos un fichero .htaccess con este contenido en la raiz de nuestro sitio:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$1 [L] 
</IfModule>

Para que esto funcione hay que habilitar los ficheros .htaccess en la configuración del Apache (AllowOverride All)
Y damos permiso de escritura a los directorios necesarios:

#añadir usuario al grupo de apache
sudo usermod -aG www-data mi_usuario

//los directorios pertenecen al grupo y usuario apache
sudo chown -R www-data:www-data storage
sudo chown -R www-data:www-data bootstrap/cache

//darles permiso de escritura
sudo chmod -R 770 storage/
sudo chmod -R 770 bootstrap/cache/

#o bien

sudo chmod -R 775 storage

sudo chmod -R 775 bootstrap/cache

sudo chown -R nuestroUsuario:www-data storage

sudo chown -R nuestroUsuario:www-data bootstrap/cache

Una vez editado el fichero «.env» con los datos de la base de datos (usuario, contraseña…) podemos crear la estructura inicial de autentificación

php artisan migrate

Podemos instalar las traducciones de los mensajes de validación y demás en castellano, català y demás con el siguiente paquete:

https://github.com/Laravel-Lang/lang

que depende la versión de PHP instalaríamos de una u otra forma, por ejemplo:

composer require laravel-lang/lang

Por último, podemos eliminar las dependencias no necesarias de Node listadas en package.json,

npm uninstall nombre_dependencia --save-dev

Si queréis ahorrar tiempo podéis hacer uso de BrowserSync

npm install browser-sync browser-sync-webpack-plugin@^2.3.0 --save-dev --legacy-peer-deps

Hay que modificar también webpack.mix.js

 .browserSync({
        open: 'external',
        host: 'prueba.com',
        proxy: 'prueba.com',
        files: ['resources/views/**/*.php', 'app/**/*.php', 'routes/**/*.php', 'public/js/*.js', 'public/css/*.css']
    })

Instalar entorno de desarrollo APACHE, PHP y MySQL

Vamos a instalar el entorno de desarrollo php en un sistema linux (debian) con las aplicaciones más comunes.

Para instalar las tres aplicaciones principales y algunas extensiones imprescindibles lo hacemos desde el terminal (CTRL+ALT+T) con la siguiente orden:

sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql php-mbstring php-xml

Seguramente necesitaremos habilitar algunos módulos de apache

sudo a2enmod headers expires rewrite

Puede que tengamos que habilitar los ficheros .htaccess, para ello debemos editar /etc/apache2.conf y buscar «AllowOverride», cambiando su valor de «false» a «All»

Vemos que todo funcione arrancando apache y yendo a http://localhost

apache2 service start

Seguimos y configuramos mysql con:

sudo mysql_secure_installation

Añadimos tu usuario al grupo de apache

sudo usermod -a -G www-data [tu usuario]

Asignamos la carpeta de los proyectos de apache al grupo de usuarios de apache

sudo chown -R :www-data /var/www/

Le damos permiso de escritura al grupo

sudo chmod -R 775 /var/www/

Y con esto ya estaría, solo tendríamos que añadir un nuevo sitio. Para ello creamos un directorio para el sitio, por ejemplo /var/www/prueba.com

mkdir prueba.com

editaríamos el fichero /etc/hosts con una ip (127.0.0.1) y un dominio de prueba, por ejemplo prueba.com

127.0.0.1    prueba.com

y luego editaríamos un fichero de configuración en /etc/apache2/sites-available/prueba.com.conf y habilitaríamos esta configuración con a2ensite prueba.com.conf. El contenido de este fichero podría ser similar a esto:

<VirtualHost *:80>
        Define site_name prueba.com   
        ServerName ${site_name}     
        DocumentRoot /var/www/${site_name}     
        ErrorLog /var/www/${site_name}/error.log
        CustomLog /var/www/${site_name}/access.log combined
</VirtualHost>

Y finalmente habilitamos el sitio y recargamos la configuración de Apache:

sudo a2ensite prueba.com
sudo systemctl reload apache2