刀片模板中的@php 标记无法访问内联变量

Posted

技术标签:

【中文标题】刀片模板中的@php 标记无法访问内联变量【英文标题】:@php tag in blade template can't reach inline variable 【发布时间】:2022-01-19 11:15:53 【问题描述】:

我正在循环浏览具有我所有可配置选项的产品。在里面我正在循环浏览我的项目,当我在产品中找到匹配项时,我想显示这个产品和项目。

为此,我想创建一个名为 $currentProduct 的变量。

@foreach($order['products'] as $product) // Configurable products
    @foreach($order['items'] as $item)  // Simple products
        @if ($item['product_type'] == 'simple')
            @if ($product['id'] === $item['product_id'])
                @php($currentProduct = $product) // error here $product undefined
                @php($currentItem = $item) // error here $item undefined
            @endif
        @elseif ($item['product_type'] == 'configurable')
            @if ($product['id'] == $item['parent_item']['product_id'])
                @php($currentProduct = $product) // error here $product undefined
                @php($currentItem = $item) // error here $item undefined
            @endif
        @endif
    @endforeach
@endforeach

我是 laravel 和刀片模板的新手,我似乎无法理解,为什么 $product 和 $item 在同一个模板中在上面定义时是未定义的。

任何帮助表示赞赏

【问题讨论】:

我对 Laravel Blade 几乎没有经验,但我看到的所有示例都包含在 @php@endphp 之间分配变量的代码。你可以试试吗? 给出同样的错误。我不认为这是一个语法问题,因为 @php() 被接受了。我可以定义其他变量,我只是无法到达@php 标签之外的变量 【参考方案1】:

您将代码放在@php@endphp 之间,但没有括号。 使用$loop 变量可能会成功:

@foreach($order['products'] as $product) // Configurable products
    @foreach($order['items'] as $item)  // Simple products
        @if ($item['product_type'] == 'simple')
            @if ($product['id'] === $item['product_id'])
                @php
                    $currentProduct = $order['products'][$loop->parent->index];
                    $currentItem = $order['items'][$loop->index];
                @endphp
            @endif
        @elseif ($item['product_type'] == 'configurable')
            @if ($product['id'] == $item['parent_item']['product_id'])
                @php
                    $currentProduct = $order['products'][$loop->parent->index];
                    $currentItem = $order['items'][$loop->index];
                @endphp
            @endif
        @endif
    @endforeach
@endforeach

然后可以在定义它们的位置下方使用这些变量。

查看文档:

$loop 属性:https://laravel.com/docs/master/blade#the-loop-variable 刀片模板中的原始 PHP:https://laravel.com/docs/8.x/blade#raw-php

【讨论】:

这是这里最奇怪的事情......我可以创建一个我可以在下面访问的变量等 $var = 1。问题是 $product 在 php 标签内未定义,因此在php 标签。 好的,我现在明白了。我已经更新了答案。使用$loop 可能会成功。【参考方案2】:

任何@php 都必须以@endphp 结束

【讨论】:

取决于 laravel 版本。在我的追逐中,这不是问题。希望就这么简单..【参考方案3】:

你能试试下面的代码吗? `

@foreach($order['products'] as $product)
    @foreach($order['items'] as $item)
        @if ($item['product_type'] == 'simple')
            @if ($product['id'] === $item['product_id'])
                @php ($currentProduct = $product) @endphp
                @php ($currentItem = $item) @endphp
            @endif
        @elseif ($item['product_type'] == 'configurable')
            @if ($product['id'] == $item['parent_item']['product_id'])
                @php ($currentProduct = $product) @endphp
                @php ($currentItem = $item) @endphp
            @endif
        @endif
    @endforeach
@endforeach

`

【讨论】:

给出同样的错误。 $product/ $item 未定义变量 @Suresh Prajapati 很高兴您的回答!但是,请始终尝试解释您所做的(或您的答案),而不是提供替代代码;) 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于刀片模板中的@php 标记无法访问内联变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在刀片模板的 foreach 循环中访问 laravel 集合?

如何防止访问laravel刀片中的数据库和资源?

无法将环境变量传递给 azure 管道 yaml 中的 powershell 脚本(非内联)

刀片视图中的laravel未定义变量

PHP 被设置为移除内联块,这将导致多个核心应用无法访问。 这可能由缓存/加速器导致的,例如 Zend OPcache 或 eAccelerator。

Laravel 5.2:如何在刀片模板中设置变量,没有 php 标签?