使用Builder模式时如何允许唯一的Laravel Facade实例?

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

我正在使用Builder模式,但在两次调用之间会得到数据混淆。我希望在每次对我的外观进行静态调用时都有一个新实例。示例:

基础课

<?php

namespace Me\Package;

class PHPFile
{
    public function set($key, $value) {
        $this->$key = $value;
        return $this;
    }

    public function get($key) {
        return isset($this->$key) ? $this->key : 'NO_SUCH_KEY';
    }

    public function sum()
    {
        // example of an "ending" method
    }
}

外观

<?php

namespace Me\Package\Facades;

use Illuminate\Support\Facades\Facade;

class PHPFile extends Facade {
   protected static function getFacadeAccessor() { return 'PHPFile'; }
}

服务提供者

use Me\Package\PHPFile;

public function register()
{
    App::bind('PHPFile',function() {
        return new PHPFile;
    });
}

测试

print PHPFile::set('first', 10)->set('second', 20)->sum();
// 30
print PHPFile::get('first');
// 10 !!!

由于立面保持相同的实例,因此第二行测试将打印10。我在这里要'NO_SUCH_KEY'-每个静态调用后都有一个新实例。我怎样才能做到这一点?我试图使外观返回最小的“工厂”,只是构造函数返回了新的PHPFile实例,但没有成功。我还阅读了我应该在“结束”方法(求和/获取)中调用new static的方法,但不确定如何做到这一点并保持累积的数据。

php laravel facade
1个回答
0
投票

添加工厂

[该工厂将使用魔术__call方法拦截任何调用,然后将其分派到新的PHPFile(My Builder类)

<?php

namespace Me\Package\Factories;

use Me\Package\PHPFile;

class PHPFileFactory
{
    public function __call($method, $args)
    {
        return (new PHPFile)->$method(...$args);
    }    
}

在服务提供者中绑定factory

App::bind('PHPFile',function() {
    return new PHPFileFactory;
});

感谢@apokryfos指出我需要返回其他内容-不是Builder本身,而是另一个类。

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