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.
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;
}
}
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 ... :).. .
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.
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;
}
}
}
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;
}
}