2014-07-18 1 views
1

Возьмите это (не) режущего диска сценарий list.blade.php:Laravel Блейд шаблоны визуализируются 2 раза

<?php 
error_log(print_r("START" , true)); 

global $i; 

for ($a = 0 ; $a < 3 ; $a++) { 
    $j = @(int)$i; 

    error_log(print_r($j , true)); 
    echo $j; 

    $i = $j + 1 ; 
} 

error_log(print_r("STOP" , true)); 

Ожидаемый результат должен быть 012, но выход 345!

Если проверить журналы ошибок сервера, вы можете увидеть это:

START 
0 
1 
2 
STOP 
START 
3 
4 
5 
STOP 

Поэтому шаблон побежал в первый раз без вывода чего-либо, и он побежал во второй раз, и выход будет отправлен.

Я использую обновленную версию Laravel 4.2. Это не проблема, но когда каждая анализируемая строка запрашивает тяжелую вычислительную задачу, время загрузки всего лишь X2.

Считаете ли вы, что это ошибка или это нормальное поведение?

Есть ли способ избежать некоторых исполнений в шаблоне при первом запуске (сухой запуск)?

+0

где вы можете скачать этот шаблон? И использование глобальных просто уродливает меня. Используйте декораторы, если вы хотите передать дополнительные данные. – Pinoniq

+0

Этот шаблон - только PoC. Global просто используется для поддержания состояния между несколькими нагрузками, чтобы показать вам проблему. – Potsky

ответ

0

Это не ответ. Я только что проверил ваш код и получил результат 012. Я протестировал его с версией 4.2.6. Я понятия не имею, как вы его получили.

Вот код, который я использовал.

приложение/route.php

Route::get("test",function(){ 
    return View::make("aaa"); 
}); 

приложение/просмотров/aaa.blade.php

<?php 
error_log(print_r("START" , true)); 

global $i; 

for ($a = 0 ; $a < 3 ; $a++) { 
    $j = @(int)$i; 

    error_log(print_r($j , true)); 
    echo $j; 

    $i = $j + 1 ; 
} 

error_log(print_r("STOP" , true)); 
+0

Вы правы! Я использую свой шаблон Laravel, но это преступник. Я использую фильтр after, чтобы минимизировать HTML-код на лету. Я отвечу на мой вопрос. – Potsky

1

Проблема найдена, но не решение! Я использую свой шаблон Laravel, но это преступник. Я использую глобальный после фильтра Минимизировать HTML-код на лету (добавленных журналов ошибок для этого вопроса):

App::after(function ($request, $response) { 

    // Minify only texts 
    if (strpos($response->headers->get('content-type') , 'text/') !== false) { 
     if ($response instanceof Illuminate\Http\Response) { 

error_log(print_r('coucou1' , true)); 
      $output = $response->getOriginalContent(); 
error_log(print_r('coucou2' , true)); 

      $re = '%# Collapse whitespace everywhere but in blacklisted elements. 
      (?>    # Match all whitespans other than single space. 
      [^\S ]\s*  # Either one [\t\r\n\f\v] and zero or more ws, 
      | \s{2,}  # or two or more consecutive-any-whitespace. 
      ) # Note: The remaining regex consumes no text at all... 
      (?=    # Ensure we are not in a blacklist tag. 
      [^<]*+  # Either zero or more non-"<" {normal*} 
      (?:   # Begin {(special normal*)*} construct 
      <   # or a < starting a non-blacklist tag. 
      (?!/?(?:textarea|pre|script)\b) 
      [^<]*+  # more non-"<" {normal*} 
      )*+   # Finish "unrolling-the-loop" 
      (?:   # Begin alternation group. 
      <   # Either a blacklist start tag. 
      (?>textarea|pre|script)\b 
      | \z   # or end of file. 
      )    # End alternation group. 
      ) # If we made it here, we are not in a blacklist tag. 
      %Six'; 

error_log(print_r('coucou3' , true)); 

      $output = preg_replace($re , " " , $output); 

error_log(print_r('coucou4' , true)); 
      if ($output !== null) { 
       $response->setContent($output); 
      } 
error_log(print_r('coucou5' , true)); 
     } 
    } 

}); 

и результат журнала ошибок действительно удивительно:

START 
0 
1 
2 
STOP 
coucou1 
coucou2 
coucou3 
START 
3 
4 
5 
STOP 
coucou4 
coucou5 

Шаблон лезвие оценивается второй раз на следующей строке:

$output = preg_replace($re , " " , $output); 

Что невозможно в PHP ... Я думаю, что я скучаю дизайн Laravel архитектуры ... Если кто-нибудь понять ...