web-dev-qa-db-fra.com

Comment compresser le code HTML dans laravel 5

Dans Laravel 4.0, j'utilise le code ci-dessous pour compresser les sorties de réponse HTML laravel au navigateur, mais cela ne fonctionne pas dans laravel 5.

App::after(function($request, $response)
{
    if($response instanceof Illuminate\Http\Response)
    {
        $buffer = $response->getContent();
        if(strpos($buffer,'<pre>') !== false)
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n([\S])/"                => '$1',
                "/\r/"                      => '',
                "/\n/"                      => '',
                "/\t/"                      => '',
                "/ +/"                      => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
    }
});

S'il vous plaît, comment puis-je faire ce travail dans Laravel 5. 

OR

Veuillez fournir un meilleur moyen de compresser le code HTML dans laravel 5, le cas échéant ... Merci d'avance. 

NB: Je ne souhaite utiliser aucun paquetage laravel pour compresser html, j'ai juste besoin d'un code simple qui fait le travail sans compromettre les performances.

17
Digitlimit

La manière recommandée de le faire dans Larvel 5 est de réécrire votre fonction en tant que middleware . Comme indiqué dans la documentation:

..ce middleware effectuerait sa tâche après que la demande soit traitée par l'application:

<?php namespace App\Http\Middleware;

class AfterMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}
6
darronz

Le code complet est le suivant (avec GZip personnalisé activé):

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware
{
    /**
     * 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(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n([\S])/"                => '$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;
    }
}

Vérifiez l’inspecteur Content-Length de votre navigateur avant/après l’application de ce code.

profitez-en ... :).. .

16
ivahidmontazer

Ce n'est pas une très bonne solution pour minimiser le code HTML dans les middlewares, car vous pouvez y consacrer beaucoup de temps CPU et s'exécute à chaque requête.

Au lieu de cela, il est préférable d’utiliser le package htmlmin ( https://github.com/HTMLMin/Laravel-HTMLMin ):

composer require htmlmin/htmlmin
php artisan vendor:publish

Réduire au minimum le code HTML au niveau du modèle de lame et le mettre en cache dans le stockage devrait être beaucoup plus efficace. 

8
Jokerius

C'est presque une copie de Vahid's answer mais cela résout deux problèmes.

1) Il vérifie si la réponse est une BinaryFileResponse car toute tentative de modification de ce type de réponse déclenchera une exception.

2) Il a conservé les caractères de nouvelle ligne, car l'élimination complète des nouvelles lignes entraînerait un code Javascript incorrect sur les lignes avec un commentaire à une ligne.

Par exemple, le code ci-dessous

 var a; //This is a variable
 var b; //This will be commented out

Va devenir

 var a; //This is a variable var b; //This will be commented out

Remarque: au moment de cette réponse, je ne pouvais pas mettre la main sur une bonne expression rationnelle pour faire correspondre des commentaires sur une seule ligne sans complications ou plutôt, ignorer les nouvelles lignes uniquement sur les lignes avec un commentaire sur une seule ligne.

Voici la version modifiée.

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware {

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    $response = $next($request);
    if ($response instanceof \Symfony\Component\HttpFoundation\BinaryFileResponse) {
        return $response;
    } else {
        $buffer = $response->getContent();
        if (strpos($buffer, '<pre>') !== false) {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/" => '<?php ',
                "/\r/" => '',
                "/>\n</" => '><',
                "/>\s+\n</" => '><',
                "/>\n\s+</" => '><',
            );
        } else {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/" => '<?php ',
                "/\n([\S])/" => '$1',
                "/\r/" => '',
                "/\n+/" => "\n",
                "/\t/" => '',
                "/ +/" => ' ',
            );
        }
        $buffer = preg_replace(array_keys($replace), array_values($replace), $buffer);
        $response->setContent($buffer);
        ini_set('zlib.output_compression', 'On'); //enable GZip, too!
        return $response;
    }
  }
}
3
Victor Anuebunwa

c’est la meilleure façon… nous n’avons pas besoin d’utiliser des paquets de laravel. Merci …__.

<?php

namespace App\Http\Middleware;

use Closure;

class OptimizeMiddleware
{
    /**
     * 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(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\r/"                      => '',
                "/>\n</"                    => '><',
                "/>\s+\n</"                 => '><',
                "/>\n\s+</"                 => '><',
            );
        }
        else
        {
            $replace = array(
                '/<!--[^\[](.*?)[^\]]-->/s' => '',
                "/<\?php/"                  => '<?php ',
                "/\n([\S])/"                => '$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;
    }
}

0
AliAsghar