Acelerar páginas o procesos con la cache de Laravel

Se puede acelerar procesos, o páginas con la cache de Laravel

La página se puede encerrar con una función «Cache::remember» guardándola con una clave única, por ejemplo para una hora y un listado de json:

$resultado_json = Cache::remember("listado-".$id, 3600, function () use ($request) {
    return Productos::all()->toJson();
});
return $resultado_json;

Claro, ¿qué pasa si cambian los productos? podemos escuchar el modelo en su evento «saved» que lee tanto los «updates» como los «inserts» y el evento «deleted» para borrar la cache:

    protected static function booted()
    {
        static::saved(function ($user) {
            Cache::flush();
        });
        static::deleted(function ($user) {
            Cache::flush();
        });
    }

Fechas en Laravel con Eloquent y Carbon

Para manejar las fechas en Laravel con Eloquent tenemos la librería Carbon que nos ayudará muchísimo, solo hay que incluirla en el modelo:

use Carbon/Carbon;

Para darle funcionalidad, añadimos los campos que queramos tratar como fechas:

protected $dates = ['fecha'];

Cuando queramos recoger su valor en el formato que queramos lo haremos de esta manera:

public function getFechaAttribute($value) {
    if (!$value) return null;
    return Carbon::parse($value)->format('d-m-Y H:i:s');
}

Y si queremos que tambien se incluya cuando lo requerimos en JSON:

public function serializeDate($date)
{
    return $date->format('d-m-Y H:i:s');
}

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';
    }