Laravel Blade模板渲染2次

时间:2014-07-18 09:26:02

标签: php laravel-4 blade

采用此(非)刀片脚本list.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 ) );

预期结果应为012,但输出为345

如果检查服务器错误日志,可以看到:

START
0
1
2
STOP
START
3
4
5
STOP

因此,模板第一次运行而不输出任何内容,它会再次运行,然后发送输出。

我使用的是更新的Laravel 4.2版本。这不是一个真正的问题,但是当每个解析的行请求繁重的计算任务时,加载时间只是X2。

你认为这是一个错误还是正常行为?

有没有办法在首次启动(干运行)时避免模板中的某些执行?

2 个答案:

答案 0 :(得分: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架构设计......如果有人理解任何事情......

答案 1 :(得分: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 ) );