Laravel 5 Blade Template中的PHP代码

时间:2015-06-27 10:53:16

标签: php laravel-5 blade

我必须在Laravel 5 Blade Template中放置一些PHP代码。如下所示

@foreach ($farmer->tasks as $task)
    @if ($task->pivot->due_at) < date(now))
        $style = 'alert alert-danger';
    @elseif ($task->pivot->due_at) > date(now))
        $style = 'alert alert-success';
    @else
        $style = '';
    @endif
@endforeach

将PHP代码放在Laravel 5 Blade Template中的实际过程是什么?

5 个答案:

答案 0 :(得分:62)

根据documentation,在Laravel 5.2及更新版本中,您可以使用以下代码:

@php
{{-- php code here --}}
@endphp

或者,您可以像here所述扩展Blade模板引擎。

如果上述两种解决方案都不合适,那么你会被@Armen和@Gonzalo给出的答案所困扰

答案 1 :(得分:13)

只需打开和关闭php标记:<?php $style = '...'; ?>

答案 2 :(得分:3)

Laravel食谱建议一种简单但有效的方法,不包括php标签

{{--*/ $var = 'test' /*--}}

{{ - - }}用作裁剪评论 /和/ 可以恢复评论产生的效果

<?php $var = 'test' ?>

问题是它比包含php标签更长: - (

答案 3 :(得分:2)

以下新的NewBladeCompiler将使用@{ }}接受所有php代码,如变量赋值,类声明等。 例如@{ $variable = 0; }}将汇编为<?php $variable=0; ?>

    <?php

use Illuminate\View\Compilers\BladeCompiler;

class NewBladeCompiler extends BladeCompiler
{

    /**
     * Get the echo methods in the proper order for compilation.
     *
     * @return array
     */
    function getEchoMethods()
    {
        $methods = [
            'compileRawEchos'     => strlen(stripcslashes($this->rawTags[0])),
            'compileEscapedEchos' => strlen(stripcslashes($this->escapedTags[0])),
            'compileRegularEchos' => strlen(stripcslashes($this->contentTags[0])),
            'compilePhpEchos'     => strlen(stripcslashes("@{"))
        ];

        uksort($methods, function ($method1, $method2) use ($methods) {
            // Ensure the longest tags are processed first
            if( $methods[$method1] > $methods[$method2] )
            {
                return -1;
            }
            if( $methods[$method1] < $methods[$method2] )
            {
                return 1;
            }
            // Otherwise give preference to raw tags (assuming they've overridden)
            if( $method1 === 'compilePhpEchos' )
            {
                return -1;
            }
            if( $method2 === 'compilePhpEchos' )
            {
                return 1;
            }
            if( $method1 === 'compileRawEchos' )
            {
                return -1;
            }
            if( $method2 === 'compileRawEchos' )
            {
                return 1;
            }
            if( $method1 === 'compileEscapedEchos' )
            {
                return -1;
            }
            if( $method2 === 'compileEscapedEchos' )
            {
                return 1;
            }
        });

        return $methods;
    }

    function compilePhpEchos( $value )
    {
        $pattern  = sprintf('/(@)?%s\s*(.+?)\s*%s(\r?\n)?/s', "@{", "}}");
        $callback = function ($matches) {
            $whitespace = empty($matches[3]) ? '' : $matches[3] . $matches[3];
            return $matches[1] ? substr($matches[0], 1) : '<?php ' . $matches[2] . ' ?>' . $whitespace;
        };
        return preg_replace_callback($pattern, $callback, $value);
    }

}

?>

答案 4 :(得分:2)

在现代Laravel(6/7)中,您应该这样做:

@php
   yourphpcode();
@endphp