使用object方法作为回调t并将数据传递给PHP中的方法

时间:2017-10-06 13:03:57

标签: php

我有一个使用Curl的beforeSend回调的课程。这是:

$curl->beforeSend(function() use ($exchanger, $ratesUpdate) {
    ExchangerRatesUpdate::create([
        'exchanger_id'    => $exchanger->id,
        'rates_update_id' => $ratesUpdate->id
    ]);
});

我想通过将回调内部的逻辑提取到自己的方法来重构这段代码,例如:private function beforeSend($exchanger, $ratesUpdate)并在$cur->beforeSend中调用它。

我该怎么做?我发现其他答案说我可以传递一个数组,比如[$this, 'beforeSend'],但它会抛出一个错误(从空值创建默认对象),而且我也无法找到如何将参数传递给该方法。

这种方法有效,但看起来我通过传递参数数组两次来完成双重工作:

        $curl->beforeSend(function() use ($exchanger, $ratesUpdate) {
            call_user_func_array([$this, 'beforeXmlFetching'], [
                'exchanger'   => $exchanger,
                'ratesUpdate' => $ratesUpdate
            ]);
        });

1 个答案:

答案 0 :(得分:0)

我不知道我是否回答了您的问题,但在您的具体情况下,您可以实施builder

class ExchangerRatesUpdateBuilder
{
    protected $exchanger;
    protected $ratesUpdate;

    public function build()
    {
        return ExchangerRatesUpdate::create([
            'exchanger_id'    => $this->exchanger->id,
            'rates_update_id' => $this->ratesUpdate->id
        ]);
    }

    public function setExchanger($exchanger)
    {
        $this->exchanger = $exchanger;

        return $this;
    }

    public function setRatesUpdate($ratesUpdate)
    {
        $this->ratesUpdate = $ratesUpdate;

        return $this;
    }
}

在您的脚本中,您必须像这样(如服务)实例化构建器:

$builder = new ExchangerRatesUpdateBuilder()

当你调用$ curl-> beforeSend()方法时,你可以传递'build'回调:

$curl->beforeSend([$builder->setExchanger($exchanger)->setRatesUpdate($ratesUpdate), 'build']);