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

Laravel Blade component method undefined in production but work in local dev

我在 app/View/Components/Notes 中有一个组件 NoteTag,在 resources/views/components/notes[ 中有一个 blade 组件.

我在这样的 parent 组件中使用此组件:

<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()]);
    }

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

根据 https://github.com/laravel/framework/issues/31919 and Laravel docs: Manually Registering Components 我已经在 AppServiceProvider:

中试过了

use App\View\Components\Notes\NoteTag;
use Illuminate\Support\Facades\Blade;

...

class AppServiceProvider extends ServiceProvider
{

    ...

    public function boot()
    {
        Blade::component('note-tag', NoteTag::class);
    }

    ...

运气不好。

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

有人提到 class 名称的大小写问题。有些人提到手动注册组件。 None 其中对我有用。

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

我使用的是最新版本的 Laravel 和 PHP 8.

The repo for the application

有什么想法吗?

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


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

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

Laravel 非常讲究它的命名方案。
所有文件名必须完全匹配其命名空间和 class 名称,包括大小写。视图不是这种情况,它们可以位于任何位置,因为它们是在具有相对路径的渲染方法中调用的。

唯一对我有用的解决方案是将我的组件移动到 App\View\Components 文件夹,例如

php artisan make:component notetag