2015-03-22 31 views
9

Trong Laravel 4.0, tôi sử dụng mã dưới đây để nén các kết quả đầu ra đáp ứng HTML laravel để trình duyệt, tuy nhiên nó không hoạt động trong laravel 5.Làm thế nào để nén HTML trong 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); 
    } 
}); 

hãy làm thế nào để tôi làm công việc này trong laravel 5.

HOẶC

Vui lòng cung cấp một cách tốt hơn nén HTML trong laravel 5 nếu có. Cảm ơn trước.

NB: Tôi không muốn sử dụng bất kỳ gói laravel nào để nén html, chỉ cần một mã đơn giản thực hiện công việc mà không làm mất hiệu suất.

+1

Tôi biết bạn đã nói bạn không muốn một pacakge - nhưng https://github.com/GrahamCampbell/Laravel-HTMLMin là giải pháp hoàn hảo. Và nó sẽ không "giết hiệu suất" bất kỳ cách nào khác hơn là nếu bạn tự mình làm nó. – Laurence

+1

Tôi khuyên bạn không nên làm gì với _at all_ - một phần tử 'pre' không phải là thứ duy nhất mà không gian trắng có thể quan trọng, mà còn bên trong' textarea'/'input' hoặc về cơ bản trong phần tử _any_ nếu nó sau này trên _formatted_ qua CSS ('khoảng trống trắng'). Chỉ __GZip__ đầu ra trước khi gửi nó cho khách hàng, điều đó hiệu quả hơn nhiều so với việc làm rối tung mã HTML. – CBroe

+0

@cbroe làm cách nào để sử dụng GZip? bất kỳ ví dụ làm việc nào – Digitlimit

Trả lời

6

Cách được khuyến nghị để làm điều này trong Larvel 5 là viết lại hàm của bạn dưới dạng middleware. Như đã nêu trong các tài liệu:

..this middleware sẽ thực hiện nhiệm vụ của mình sau yêu cầu được xử lý bởi các ứng dụng:

<?php namespace App\Http\Middleware; 

class AfterMiddleware implements Middleware { 

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

     // Perform action 

     return $response; 
    } 
} 
+0

Rất tốt. Làm thế nào để tôi sử dụng nó? Đang chạy điều này trên mỗi yêu cầu? – Digitlimit

+1

Có, bạn sẽ chạy nó trên mọi yêu cầu http. Bạn có thể đăng ký nó trên toàn cầu bằng cách thêm lớp của bạn trong 'app/Http/Kernel.php' – darronz

11

Toàn bộ code đang này (với tùy chỉnh Gzip kích hoạt):

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

Vui lòng kiểm tra thanh công cụ mạng trình duyệt của bạn để biết tiêu đề Content-Length trước/sau khi triển khai mã này.

thưởng thức nó ... :) ...

2

Đây gần như là một bản sao của câu trả lời là Vahid's nhưng nó khắc phục hai sự cố.

1) Kiểm tra xem phản hồi có phải là BinaryFileResponse vì mọi nỗ lực sửa đổi loại phản hồi này sẽ ném Ngoại lệ.

2) Nó giữ lại các ký tự dòng mới khi loại bỏ hoàn toàn các dòng mới sẽ dẫn đến mã Javascript xấu trên các dòng có nhận xét một dòng.

Ví dụ, đoạn code dưới đây

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

sẽ trở thành

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

Lưu ý: Tại thời điểm câu trả lời này tôi không thể có được bàn tay của tôi trên một regex tốt để phù hợp với ý kiến ​​dòng đơn mà không có biến chứng hay đúng hơn, bỏ qua dòng mới trên chỉ dòng với bình luận dòng duy nhất, vì vậy tôi hy vọng cho một sửa chữa tốt hơn.

Đây là phiên bản đã sửa đổi.

<?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; 
    } 
    } 
} 
+1

Cũng có vấn đề này! Cảm ơn đã chỉ ra điều đó. –

0

đây là cách tốt nhất .. chúng tôi không cần phải sử dụng laravel packeges .Thanks ..

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

+1

Đoạn mã dường như không chạy. – clearlight

2

Nó không phải là giải pháp rất tốt để rút gọn html trong middleware như bạn có thể dành nhiều thời gian CPU cho nó và nó chạy trên mọi yêu cầu.

Thay vào đó nó là tốt hơn để sử dụng htmlmin gói (https://github.com/HTMLMin/Laravel-HTMLMin):

composer require htmlmin/htmlmin 
php artisan vendor:publish 

Rút gọn HTML trên mức lưỡi mẫu và bộ nhớ đệm trong vùng lưu trữ nên hiệu quả hơn nhiều.

Các vấn đề liên quan