Как сжать HTML в laravel 5

в Laravel 4.0 я использую приведенный ниже код для сжатия выходных данных ответа HTML laravel в браузере, однако он не работает в laravel 5.

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

пожалуйста, как мне сделать эту работу в Laravel 5.

или

пожалуйста, предоставьте лучший способ сжатия HTML в laravel 5, если таковые имеются. Спасибо заранее.

NB: я не хочу использовать какой-либо пакет laravel для сжатия html, просто нужен простой код, который выполняет работу без убийства спектакль.

6 ответов


рекомендуемый способ сделать это в Larvel 5-переписать вашу функцию как промежуточное. Как указано в документах:

..это промежуточное ПО выполнит свою задачу после запрос обрабатывается приложением:

<?php namespace App\Http\Middleware;

class AfterMiddleware implements Middleware {

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

        // Perform action

        return $response;
    }
}

полный код (с включенным пользовательским GZip):

<?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])/"                => '',
                "/\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;
    }
}

пожалуйста, проверьте ваш браузер Network inspector для Content-Length заголовок до / после реализации этого кода.

понравится ... :).. .


это не очень хорошее решение для минимизации html в middleware, так как вы можете потратить на него много времени процессора, и он работает по каждому запросу.

вместо этого лучше использовать пакет htmlmin (https://github.com/HTMLMin/Laravel-HTMLMin ):

composer require htmlmin/htmlmin
php artisan vendor:publish

минимизация HTML на уровне шаблона Блейда и кэширование его в хранилище должно быть намного эффективнее.


Это почти копия Вахид-х ответ, но он устраняет две проблемы.

1) это проверка, если ответ BinaryFileResponse как любая попытка изменить этот тип ответа вызовет исключение.

2) он сохранил символы новой строки, поскольку полное исключение новых строк приведет к плохому коду Javascript на строках с однострочным комментарием.

например, код ниже

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

станет

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

Примечание: В время этого ответа я не мог получить хорошее регулярное выражение, чтобы соответствовать однострочным комментариям без осложнений или, скорее, игнорировать новые строки только в строках с однострочным комментарием, поэтому я надеюсь на лучшее исправление.

вот измененная версия.

<?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])/" => '',
                "/\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;
    }
  }
}

Это лучший способ.. нам не нужно использовать Laravel packeges .Спасибо..

<?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])/"                => '',
                "/\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;
    }
}

для легкого сжатия я создаю свою собственную библиотеку, которая требует небольшого изменения конфигурации в app/Http/Kernel.php в основном он будет использовать AfterMiddleware концепция laravel, где все выходные данные готовы к удалению в браузер. Так это Middleware будет срабатывать прямо перед отправкой вывода html в браузер.

protected $middleware = [
    ...
    \Vrkansagara\Http\Middleware\AfterMiddleware::class,
    ...
];

вы также можете настроить несколько сред одновременно с помощью .

более детально о том, как установить и настроить будет найти здесь