Laravel刀片组件方法在生产中未定义,但在本地开发中有效
我在应用程序/查看/组件/便笺中有一个组件NoteTag
,在resources/views/components/notes.
我在父组件中使用此组件,如下所示:
<x-notes.note-tag :name="$tag->name"></x-notes.note-tag>
NoteTag
有一个我想在视图中使用的方法:
public function typeColor()
{
return substr(md5($this->name), 0, 6);
}
我在视图中引用该方法,如下所示:
<span style="border: 2px #{{ $typeColor() }} solid" class="rounded-lg mr-2 px-1 bg-gray-200 text-gray-600 shadow">
{{ $name }}
</span>
这在本地开发中效果很好,但在生产中我得到了这样的结果:
[previous exception] [object] (ErrorException(code: 0): Undefined variable $typeColor at /home/forge/loggbok.michaelsimsoe.no/storage/framework/views/e354b32f864ce675974b798281d94fe7f4dd2831.php:1)
[stacktrace]
我还尝试将其作为数据传递给视图:
public function render()
{
return view('components.notes.note-tag', ['color' => $this->typeColor()]);
}
,这会导致相同的错误。所以我猜在产品中存在一些映射问题,其中组件视图无法找到类。
根据https://github.com/laravel/framework/issues/31919和Laravel docs: Manually Registering Components我在AppServiceProvider
中尝试过:
use AppViewComponentsNotesNoteTag;
use IlluminateSupportFacadesBlade;
...
class AppServiceProvider extends ServiceProvider
{
...
public function boot()
{
Blade::component('note-tag', NoteTag::class);
}
...
运气不佳。
我看到多次提到此问题:
- SO: laravel 7 blade component public methods not working
- SO: Laravel Components not getting my methods in shared host
- Laracasts.com: laravel 7 blade component public methods not working
有些人提到类名的大小写是一个问题。一些人提到了组件的手动注册。它们都不适合我。
我正在使用Forge在DigitalOcean上托管该应用程序。
我使用的是最新版本的Laravel和PHP 8。
The repo for the application
有什么想法吗?
解决方案
将我的评论转换为答案,因为谁不喜欢声誉?!;)
首先,您是否删除了生产服务器上
storage/framework/views
中的所有文件?
我打赌这只是一个缓存问题,所以php artisan view:clear
或手动删除该文件夹中的文件几乎肯定会解决这个问题(著名的最后一句话)!
除此之外,app/Views/Components/Notes/NoteTag.php
的类名是noteTag
(小写的n
)有什么原因吗?
尝试更改此选项以查看这是否解决了问题。
Laravel对其命名方案非常讲究。
所有文件名必须与它们的命名空间和类名完全匹配,这包括大小写。但视图并非如此,它们可以位于任何位置,因为它们是在Render方法中使用相对路径调用的。
相关文章