Laravel 5 Blade Template中的PHP代码

abu*_*abu 30 php blade laravel-5

我必须在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
Run Code Online (Sandbox Code Playgroud)

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

use*_*864 75

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

@php
{{-- php code here --}}
@endphp
Run Code Online (Sandbox Code Playgroud)

或者,您可以按照此处的描述扩展Blade模板引擎.

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

  • 实际上很好奇 `@php` 和 `&lt;?php` 之间的差异......我的意思是可能有一个理由添加这些指令。 (3认同)

Arm*_*yan 14

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

  • 似乎是 Laravel 4 的唯一解决方案,因为不支持 @php 指令。 (2认同)

Ser*_*g_x 12

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

@php
   yourphpcode();
@endphp
Run Code Online (Sandbox Code Playgroud)


小智 5

以下新的 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);
        }

    }

?>
Run Code Online (Sandbox Code Playgroud)


Gon*_*Cao 5

Laravel 食谱提出了一种简单但有效的方法,无需包含 PHP 标签:

{{--*/ $var = 'test' /*--}}
Run Code Online (Sandbox Code Playgroud)

{{-- --}} 用作刀片注释/ 和 /恢复注释的效果

<?php $var = 'test' ?>
Run Code Online (Sandbox Code Playgroud)

问题是比包含 PHP 标签要长:-(