沃梦达 / 编程问答 / php问题 / 正文

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

Laravel Blade component method undefined in production but work in local dev(Laravel刀片组件方法在生产中未定义,但在本地开发中有效)

本文介绍了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方法中使用相对路径调用的。

这篇关于Laravel刀片组件方法在生产中未定义,但在本地开发中有效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:Laravel刀片组件方法在生产中未定义,但在本地开发中有效