【问题标题】:Laravel Blade component method undefined in production but work in local devLaravel Blade 组件方法在生产中未定义但在本地开发中工作
【发布时间】:2021-08-03 13:45:39
【问题描述】:

我在 app/View/Components/Notes 中有一个组件 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/31919Laravel 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);
    }

    ...

没有运气。

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

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

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

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

The repo for the application

有什么想法吗?

【问题讨论】:

  • 首先,您是否删除了storage/framework/views 中的所有文件?那么app/Views/Components/Notes/NoteTag.php的类名是noteTag是不是有原因呢?我敢打赌这个问题只是一个缓存问题,所以php artisan view:clear 或手动删除该文件夹中的文件几乎肯定会解决这个问题(著名的遗言;))。
  • @JustCarty 我没有。视图是否:清晰,它什么也没做。但!我已在本地将 noteTag 文件名更改为 NoteTag。显然,该更改尚未提交给 git(为什么 git 不将大写更改视为更改?)。我删除了文件,创建了一个新文件并推送它,现在它可以工作了。所有这一切都是为了缺少大写 N。谢谢!如果您将评论重新表述为答案,我会接受。

标签: php laravel laravel-blade laravel-forge


【解决方案1】:

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

php artisan make:component notetag

【讨论】:

    【解决方案2】:

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


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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-06
      • 2017-07-15
      • 2021-10-12
      • 2021-11-22
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      相关资源
      最近更新 更多