在 Laravel 中使用 pingpong/widget 会引发错误

Using pingpong/widget in Laravel throws an error

我正在使用 laravel 的包

"pingpong/widget": "~2.1",

我在config\app.php

中设置了配置

已添加

Pingpong\Widget\WidgetServiceProvider::class,

'Widget'    => Pingpong\Widget\WidgetFacade::class,

并且如文档中所述,我正在使用此代码创建一个小部件:

use Pingpong\Widget\Widget;

Widget::register('small', function($contents)
{
    return "<small>{$contents}</small>";
});

但是我得到了这个错误:

Non-static method Pingpong\Widget\Widget::register() should not be called statically, assuming $this from incompatible context

在Pingpong\Widget\Widgetclass中没有静态函数,所以这个错误当然是预料之中的。但是......当文档中的所有示例代码都使用静态 classes 而在 Widget class 中没有静态方法时,我们如何创建一个小部件?我错过了什么吗?

创建小部件对象并在其上调用 ->register() 也会引发错误,因为创建小部件需要 _construct 方法中的 BladeCompiler $blade, Container $container 而我不知道要传递什么这里。

关于此实施可能存在的问题有什么想法吗?

use Pingpong\Widget\Widget; 更改为 use Widget;

Laravel 和一些软件包包含 Facades 以方便某些组件的使用。虽然一切看起来都像是静态调用,但对外观的静态调用实际上映射到对被外观掩盖的具体对象的非静态调用。因此,当您尝试 Widget::register() 时,外观会查找它具有的 Widget class 的具体实例,然后在该实例上调用 register() 方法非-静态。

在您的 config/app.php 文件中,您添加了指向 WidgetFacadeWidget 别名。这个别名是在基本命名空间中创建的。如果你想在外观上使用这个别名,你只需要在基本命名空间中引用 Widget 别名(即 use Widget;)。

通过声明 use Pingpong\Widget\Widget;,您的 Widget::register() 调用试图调用 Pingpong\Widget\Widget class 上的静态 register() 方法,而不是调用 Pingpong\Widget\Widget class 上的方法立面。