无法访问视图内的 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])
您需要将变量发送到视图。一些方式
数组中
$test = 'Hi';
return view('components.test', ['test' => $this->test]);
与
一起使用
$test = 'Hi';
return view('components.test')->with('test', $test);
最后一张,我喜欢这张
$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 ... />
) 的那一刻开始起作用。因此,由于模板更改导致缓存视图被替换,问题可能神奇地消失了。
因此,基于此,您解决问题的最佳选择是:
- 确认您的属性是
public
,如果它们是 protected
或 private
,它们将不会在您的模板中可用。
- 清除缓存,特别是。视图缓存 (
php artisan view:clear
).
- 转储自动加载器 (
composer dump
)。
- 验证您的 class 是否实际使用。在您的构造函数中放置一个
dd()
。如果您仍然从模板中得到错误,Blade 正在绕过您的 class 并尝试将您的模板用作匿名组件。
- 将组件重命名为其他名称以查看 class 名称是否冲突。
希望对遇到这个令人困惑的问题的任何人有所帮助。
在我的例子中是因为缓存视图所以 php artisan view:clear
完成了工作
怎么了?
当您已经有一个视图组件并且在某些时候您想要添加一个专用的 class 来为您的组件提供一些数据并且因为 laravel 已经缓存了您的组件“专用 class" 不会被触发
我 运行 遇到了 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])
您需要将变量发送到视图。一些方式
数组中
$test = 'Hi'; return view('components.test', ['test' => $this->test]);
与
一起使用$test = 'Hi'; return view('components.test')->with('test', $test);
最后一张,我喜欢这张
$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 ... />
) 的那一刻开始起作用。因此,由于模板更改导致缓存视图被替换,问题可能神奇地消失了。
因此,基于此,您解决问题的最佳选择是:
- 确认您的属性是
public
,如果它们是protected
或private
,它们将不会在您的模板中可用。 - 清除缓存,特别是。视图缓存 (
php artisan view:clear
). - 转储自动加载器 (
composer dump
)。 - 验证您的 class 是否实际使用。在您的构造函数中放置一个
dd()
。如果您仍然从模板中得到错误,Blade 正在绕过您的 class 并尝试将您的模板用作匿名组件。 - 将组件重命名为其他名称以查看 class 名称是否冲突。
希望对遇到这个令人困惑的问题的任何人有所帮助。
在我的例子中是因为缓存视图所以 php artisan view:clear
完成了工作
怎么了?
当您已经有一个视图组件并且在某些时候您想要添加一个专用的 class 来为您的组件提供一些数据并且因为 laravel 已经缓存了您的组件“专用 class" 不会被触发