无法访问视图内的 Blade 个组件变量

Cannot access Blade Component variables inside the view

我 运行 遇到了 Laravel 这个非常奇怪的问题。

我遇到了一个问题,我的组件视图之一无法读取其 class 中定义的变量。 这有点奇怪,因为我的项目中有几个组件 运行,它们都工作正常,除了这个。

所以我创建了一个新的 Laravel 项目来测试一些东西(想检查问题是否出在我这边,也许我以某种方式弄乱了项目文件)。

我使用 php artisan make:component Test

在空白项目上创建了一个新组件

然后我简单地向 class 组件添加了一个测试变量,如下所示:

<?php

namespace App\View\Components;

use Illuminate\View\Component;

class Test extends Component
{

    public $test;

    /**
     * Create a new component instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->test = "testing";
    }

    /**
     * Get the view / contents that represent the component.
     *
     * @return \Illuminate\View\View|string
     */
    public function render()
    {
        return view('components.test');
    }
}

并尝试像这样在视图中访问它:

<div>
    <p> {{$test}} </p>
</div>

出于某种原因,这不起作用,我不明白为什么。它只是说 $test 未定义。 也许我应该指出,我是 Laravel 的初学者,如果我犯了一些明显的错误,请原谅。这在空白项目上不起​​作用似乎很奇怪。

提前致谢。

在 render() 函数中,而不是 return view('components.test');,执行 return view('components.test', ['test' => $this->test])

您需要将变量发送到视图。一些方式

  1. 数组中

    $test = 'Hi';
    return view('components.test', ['test' => $this->test]);
    
  2. 一起使用
    $test = 'Hi';
    return view('components.test')->with('test', $test);
    
  3. 最后一张,我喜欢这张

    $test = 'Hi';
    return view('components.test', compact('test'));
    

问候,让我知道它是如何工作的。

事实上,所有的答案都是误导性的。 $test 属性 已经是 public,因此可用于模板。请不要手动向视图添加参数。

我刚刚遇到了类似的问题,虽然我可以肯定地说它与组件 class 名称有关,但我无法追查到它,因为它又神奇地开始工作了。

我能说的是:

  • 我有一个 class 具有相同的基础 class 名称但不同的名称空间,删除了非组件 class,然后突然组件是呈现为匿名组件,完全绕过组件 class。 (您可以通过在组件 class 构造函数中放置一个 dd() 来轻松验证这一点。)

  • 我的第一个想法是自动加载器需要刷新,但 composer dump 没有任何改变。

  • 将组件 class 和模板重命名为其他名称解决了问题。

  • 想查bug的时候把class和模板重命名回原来的名字,现在突然好了...

  • 我猜是视图缓存导致了这个问题。它从我在包含组件的模板中更改 x-blade (<x-component-name ... />) 的那一刻开始起作用。因此,由于模板更改导致缓存视图被替换,问题可能神奇地消失了。

因此,基于此,您解决问题的最佳选择是:

  1. 确认您的属性是 public,如果它们是 protectedprivate,它们将不会在您的模板中可用。
  2. 清除缓存,特别是。视图缓存 (php artisan view:clear).
  3. 转储自动加载器 (composer dump)。
  4. 验证您的 class 是否实际使用。在您的构造函数中放置一个 dd() 。如果您仍然从模板中得到错误,Blade 正在绕过您的 class 并尝试将您的模板用作匿名组件。
  5. 将组件重命名为其他名称以查看 class 名称是否冲突。

希望对遇到这个令人困惑的问题的任何人有所帮助。

在我的例子中是因为缓存视图所以 php artisan view:clear 完成了工作

怎么了?

当您已经有一个视图组件并且在某些时候您想要添加一个专用的 class 来为您的组件提供一些数据并且因为 laravel 已经缓存了您的组件“专用 class" 不会被触发