带有绑定的 Laravel 门面仅实例化一次

问题描述 投票:0回答:1

我正在制作一个 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
laravel service-provider facade
1个回答
0
投票

在研究了其他软件包是如何做到这一点之后,我发现了一个与我的类似的软件包,并弄清楚了他们是如何做到这一点的。

每次静态调用我的类时,我都会创建它的一个新实例。我通过查看这个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);
    }
}

我不知道这是否是正确的方法,这是我发现的方法。

© www.soinside.com 2019 - 2024. All rights reserved.