Laravel不能使用$ this Inside Anonymous Function

时间:2016-01-22 22:29:22

标签: php laravel anonymous-function

我使用构造只获取一次请求变量,因为我需要在多个方法中使用它们,我不想重复代码。

public function __construct(Request $request)
{
    $this->labelId   = $request->label;
    $this->statusId  = $request->status;
    $this->monthId   = $request->month;
}

这适用于我的“标准”视图,但不适用于“标签视图”:

public function standard()
{
    $appointments = Appointment::latest('start')->status($this->statusId)->label($this->labelId)->month($this->monthId)->get();

    return view('appointments.index', compact('appointments'));
}

public function label(Request $request)
{
    $appointments = Label::with(['appointments' => function ($query) use ($this->labelId, $this->statusId, $this->monthId) {
        $query->label($this->labelId)->status($this->statusId)->month($this->monthId)->get();
    }])->get();

    return view('appointments.label', compact('appointments'));
}

我收到错误:

Cannot use $this as lexical variable

问题在于:

function ($query) use ($this->labelId, $this->statusId, $this->monthId)

我的问题是,我可以使用构造在标签方法中以某种方式使用变量,还是有更好的方法来实现这一点?

1 个答案:

答案 0 :(得分:4)

替换:

$appointments = Label::with(['appointments' => function ($query) use ($this->labelId, $this->statusId, $this->monthId) {
    $query->label($this->labelId)->status($this->statusId)->month($this->monthId)->get();
}])->get();

使用:

$appointments = Label::with(['appointments' => function ($query) {
    $query->label($this->labelId)->status($this->statusId)->month($this->monthId)->get();
}])->get();

你是can't pass properties of the current object via use(),但你不能use($this),但是,$this始终在PHP 5.4 +中可用。

为了使其正常工作,您需要PHP 5.4+。 PHP 5.3及更低版本有一个限制,即无法从匿名函数内部访问本地对象上下文。

  

在PHP 5.4.0之前无法使用匿名函数中的$this

您可以执行以下操作:

$instance = $this;
$appointments = Label::with(['appointments' => function ($query) use ($instance) { // ... }

但是,您无法访问privateprotected成员;它将被视为公共访问。你真的需要PHP 5.4:)

相关问题