Archivos de Categoría: Laravel 5 - Paginas 3

Error 1615 Prepared statement needs to be re-prepared en Laravel 5

En mi servidor de desarrollo no me pasa pero al subir a producción ya me ha pasado más de una vez que me salta el error:

QueryException in Connection.php line 620: SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: select * from VISTA)

Normalmente es por alguna vista y por lo que he podido leer es debido al parámetro table_definition_cache en la configuración del servidor MySQL. La solución es añadir el siguiente parámetro options en el fichero de configuración app/config/database.php

'mysql' => [
	'driver'    => 'mysql',
	'host'      => env('DB_HOST', 'localhost'),
	'database'  => env('DB_DATABASE', 'forge'),
	'username'  => env('DB_USERNAME', 'forge'),
	'password'  => env('DB_PASSWORD', ''),
	'charset'   => 'utf8',
	'collation' => 'utf8_unicode_ci',
	'prefix'    => '',
	'strict'    => false,
	'options'   => [
        	\PDO::ATTR_EMULATE_PREPARES => true
    	]
], 

Insertar y mostrar fecha con mutador en el modelo de datos con Laravel 5

Lo normal en países castellanoparlantes es que introduzcamos las fechas en formato dd/mm/yyyy pero este formato no es el adecuado para introducirlo en base de datos, lo ideal es insertarlo en base de datos en formato yyyymmdd para que no de error. Para ello en Laravel podemos crear un mutador en el modelo de datos (en este caso el campo sería fecha_recibida):

public function setFechaRecibidaAttribute($value){
   if (($timestamp = strtotime(str_replace("/", "-", $value))) === false){
      $this->attributes['fecha_recibida'] = null;
   } else {
      $this->attributes[' fecha_recibida'] = date('Ymd', $timestamp) ;
   }
}

Igualmente cuando vayamos a mostrarlo el valor querremos que este en formato dd/mm/YYYY por lo que podremos crear otro mutador:

public function getFechaRecibidaAttribute($value){
   return date('d/m/Y', strtotime($value));
}

Minificar css, javascript y html en Laravel 5

Para reducir el tiempo de carga de una página hay una serie de recomendaciones básicas y entre ellas está la de reducir al máximo los ficheros que carga el navegador, para ello la solución es devolver todo el código del fichero en una linea.
Para los css y javascript lo que suelo usar el gulp, en mi servidor de desarrollo tengo los ficheros «legibles» y cuando los quiero subir al repositorio hago la minificación con las siguientes tareas:

var gulp = require('gulp'),
  concat = require('gulp-concat'),
  uglify = require('gulp-uglify'),
  cleanCSS = require('gulp-clean-css');

gulp.task('javascript', function () {
    gulp.src('public/js/*.js')
        .pipe(uglify())
        .pipe(gulp.dest('/mnt/repositorio/public/js/'));
});

gulp.task('estilos', () => {
   gulp.src('public/css/*.css')
       .pipe(cleanCSS({compatibility: 'ie8'}))
       .pipe(gulp.dest('/mnt/repositorio/public/css/'));   
});

Pero minificar el html de salida, en mi caso en Laravel, es otra historia. Al principio probé con el componente gulp-htmlmin de gulp pero me generaba errores, también existe la posibilidad de usar paquetes de terceros para minificar como por ejemplo https://github.com/HTMLMin/Laravel-HTMLMin pero de los que he visto no funcionan en Laravel 5.0 que es el que uso por restricciones del servidor de producción, asi que googleando llegue me encontré en stackoverflow el middleware definitivo (lo retoque un poco):

<?php
namespace App\Http\Middleware;
use Closure;
class MinifyHtml
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        $buffer = $response->getContent();
        if(strpos($buffer,'<pre>') !== false)
        {
            $replace = array(
                '/<!--&#91;^\&#91;&#93;(.*?)&#91;^\&#93;&#93;-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--&#91;^\&#91;&#93;(.*?)&#91;^\&#93;&#93;-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n(&#91;\S&#93;)/"                => '$1',
                "/\r/"                      => '',
                "/\n/"                      => '',
                "/\t/"                      => '',
                "/ +/"                      => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
        ini_set('zlib.output_compression', 'On'); // If you like to enable GZip, too!
        return $response;
    }
}

Y para instalarlo es tan sencillo como añadirlo al array $middleware que tenemos en el fichero kernel.php