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

Tea*_*abx 5 php laravel laravel-blade

我在 Laravel 中遇到了这个非常奇怪的问题。

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

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

我使用在空白项目上创建了一个新组件php artisan make:component Test

然后我简单地将一个测试变量添加到类组件中,如下所示:

<?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');
    }
}
Run Code Online (Sandbox Code Playgroud)

并尝试在视图中访问它,如下所示:

<div>
    <p> {{$test}} </p>
</div>
Run Code Online (Sandbox Code Playgroud)

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

先感谢您。

错误相关图像

Lup*_*abs 9

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

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

对此我能说的是:

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

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

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

  • 当我想追踪错误时,我将类和模板重命名回原来的名称,但现在它突然起作用了......

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

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

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

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

  • 非常感谢您。你几乎做到了。我忘记了这个问题,但我打算回来自己写一些类似的东西。尽管如此,你是对的,对我来说它神奇地解决了自己,所以这可能与视图缓存和命名有关。这是我在 Laravel 中遇到的最大问题。这些神奇的名称链接很有用,直到某些东西停止工作为止。那么就无法调试,因为任何地方都没有显式声明。 (2认同)