【问题标题】:How to allow unique Laravel Facade instances when using Builder pattern?使用 Builder 模式时如何允许唯一的 Laravel Facade 实例?
【发布时间】:2020-04-22 05:31:30
【问题描述】:

我使用 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 实例,但没有成功。我还读到我应该在“结束”方法(sum/get)中调用new static,但不知道如何做到这一点并保留累积的数据。

【问题讨论】:

  • 为什么不把它作为PHPFile 逻辑的一部分(创建新实例等等)...?看来它应该有这个责任
  • 我想使用 Builder 模式启用静态可链接 API
  • 我不认为你可以,此外我认为你不应该。请为您的问题找到不同的解决方案。门面的主要目的是包裹单例。话虽这么说,如果您只想重置外观,您可以这样做PHPFile::swap(app()-&gt;make('PHPFile'))
  • 好的,谢谢!刚刚更新了问题以澄清目的。这与 Laravel QueryBuilder 非常相似,所以真的应该有一些方法来做到这一点吗?我从来没有遇到过查询冲突?
  • DB 外观是DatabaseManager 的外观,而不是查询构建器。数据库管理器单例负责返回一个查询构建器实例。这意味着查询之间没有冲突,因为那不是门面单例

标签: php laravel facade


【解决方案1】:

添加工厂

这个工厂将拦截任何带有魔法__call 方法的调用,然后将其分派到一个新的 PHPFile(我的生成器类)

<?php

namespace Me\Package\Factories;

use Me\Package\PHPFile;

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

在serviceprovider中绑定工厂

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2019-08-10
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多