Error: Function name must be a string with Closure callback

Error: Function name must be a string with Closure callback

我正在尝试编写一个带有回调函数的函数。 这是我的回调函数

    public function functionWithCallback($field, $value, Closure $callback = null)
    {
        $adminIds = Admin::when(!$callback, function ($query) use ($field, $value) {
                $query->where($field, $value);
            })->when($callback, $callback($query)) /* Error on this line */
            ->get()->pluck('id')->toArray();
    }

这是函数调用在参数中有回调的函数

    public function functionCallToCallback()
    {
        $this->functionWithCallback('id', 1);
    }

    public function functionCallToCallback2()
    {
        $this->functionWithCallback('name', 'Test', function ($query) use ($value) {
            $query->where('name', 'like', '%' . $value . '%');
        });
    }

当我运行这段代码时,它抛出了一个异常

Error: Function name must be a string

包含此代码的行中抛出的错误when($callback, $callback($query))。但是当我评论函数 functionCallToCallback 时,它抛出了另一个错误:

ErrorException: Undefined variable: query

有人知道怎么解决吗?谢谢

您正在调用回调而不是将回调传递给 when:

when($callback, $callback($query))

when 的第二个参数是回调:

when($callback, $callback)

尽管您不需要对 when 的额外调用,因为您可以将两个回调都传递给对 when:

的调用
$adminIds = Admin::when($callback, $callback, function ($query) use ($field, $value) { ... })
    ->pluck('id')->toArray();

"You may pass another closure as the third argument to the when method. This closure will only execute if the first argument evaluates as false."

旁注:不确定 functionCallToCallback2

$value 的来源