我正在制作一个 Laravel 包,并使用服务提供者和外观来使我的类可用。
我希望每次用户调用我的类时
ImageUpload::myfunc()
都会创建该类的新实例ImageUploadManager
。
当我使用
app('imageupload')->myfunc()
时,它会按照我想要的方式工作,但我想要比这更简单、“更漂亮”的东西。
可能吗?我对 Laravel 并不陌生,但对 ServiceProviders 和 Facades 有点陌生。根据我的理解,我唯一需要做的就是调用函数
bind
而不是 singleton
。
我也明白,外墙只是美化的阵列。因此,键
imageupload
已经被实例化,因此 Laravel 不会再这样做,但其他包会这样做,我只是不明白如何实现。
我的门面:
class ImageUpload extends Facade
{
protected static function getFacadeAccessor()
{
return 'imageupload';
}
}
我的服务提供商:
public function register(): void
{
$this->app->bind('imageupload', function ($app) {
return new ImageUploadManager();
});
}
在某个控制器中
ImageUpload::myfunc(); //It's always the same instance
app('imageupload')->myfunc(); //It's a new instance everytime. This is what I want
在研究了其他软件包是如何做到这一点之后,我发现了一个与我的类似的软件包,并弄清楚了他们是如何做到这一点的。
每次静态调用我的类时,我都会创建它的一个新实例。我通过查看这个package找到了这个解决方案。
我将外观更改为:
class ImageUpload extends Facade
{
protected static function getFacadeAccessor()
{
return 'imageupload';
}
public static function __callStatic($method, $args)
{
/** @var \Illuminate\Contracts\Foundation\Application|null */
$app = static::getFacadeApplication();
if (!$app) {
throw new RuntimeException('Facade application has not been set.');
}
// Resolve a new instance, avoid using a cached instance
$instance = $app->make(static::getFacadeAccessor());
return $instance->$method(...$args);
}
}
我不知道这是否是正确的方法,这是我发现的方法。