Laravel Blade 组件方法在生产中未定义,但在本地开发中有效

Mic*_*msø 4 php laravel laravel-forge laravel-blade

NoteTag我在app/View/Components/Notes中有一个组件,在resources/views/components/notes中有一个 Blade 组件。

我在父组件中使用此组件,如下所示:

<x-notes.note-tag :name="$tag->name"></x-notes.note-tag>
Run Code Online (Sandbox Code Playgroud)

NoteTag有一个我想在视图中使用的方法:

    public function typeColor()
    {
        return substr(md5($this->name), 0, 6);
    }
Run Code Online (Sandbox Code Playgroud)

我在视图中引用该方法,如下所示:

<span style="border: 2px #{{ $typeColor() }} solid" class="rounded-lg mr-2 px-1 bg-gray-200 text-gray-600 shadow">
    {{ $name }}
</span>
Run Code Online (Sandbox Code Playgroud)

这在本地开发中效果很好,但在生产中我得到了这个:

[previous exception] [object] (ErrorException(code: 0): Undefined variable $typeColor at /home/forge/loggbok.michaelsimsoe.no/storage/framework/views/e354b32f864ce675974b798281d94fe7f4dd2831.php:1)
[stacktrace]
Run Code Online (Sandbox Code Playgroud)

我还尝试将其作为数据传递给视图:

[previous exception] [object] (ErrorException(code: 0): Undefined variable $typeColor at /home/forge/loggbok.michaelsimsoe.no/storage/framework/views/e354b32f864ce675974b798281d94fe7f4dd2831.php:1)
[stacktrace]
Run Code Online (Sandbox Code Playgroud)

这会导致相同的错误。所以我猜想生产中存在一些映射问题,组件视图无法找到类。

根据https://github.com/laravel/framework/issues/31919Laravel 文档:手动注册组件我已经在以下位置尝试过AppServiceProvider

    public function render()
    {
        return view('components.notes.note-tag', ['color' => $this->typeColor()]);
    }
Run Code Online (Sandbox Code Playgroud)

没有运气。

我看到多次提到这个问题:

有些人提到类名的大小写是一个问题。有些提到了组件的手动注册。他们都不适合我。

我正在使用 Forge 在 DigitalOcean 上托管该应用程序。

我正在使用最新版本的 Laravel 和 PHP 8。

应用程序的存储库

应用程序中的文件夹结构 我的视图的文件夹结构

有任何想法吗?

Jus*_*rty 8

将我的评论转换为答案,因为谁不喜欢声誉?!;)


首先,您是否删除了storage/framework/views生产服务器上的所有文件?
我敢打赌问题只是缓存问题,因此php artisan view:clear或手动删除该文件夹中的文件几乎肯定会解决这个问题(著名的最后一句话)!

除此之外,是否有app/Views/Components/Notes/NoteTag.php一个类名noteTag(带有小写n)的原因?
尝试更改它以查看是否可以解决问题。

Laravel 的命名方案非常特殊。
所有文件名必须与其名称空间和类名完美匹配,包括大小写。视图的情况并非如此,它们可以位于任何地方,因为它们是在渲染方法中使用相对路径调用的。