2016-01-22 22 views
2

我正在使用一個構造來獲取請求變量只有一次,因爲我需要在多個方法中使用它們,我不想重複代碼。

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) 

我的問題是,我可以索姆不管怎樣,在使用構造的標籤方法中使用變量,還是有更好的方法來完成這個?

回答

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及以下版本有一個侷限性,即局部對象上下文無法從匿名函數中訪問。

It is not possible to use $this from anonymous function before PHP 5.4.0

你可以這樣做:

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

但你不能訪問privateprotected成員;它將被視爲公共訪問。你真的需要PHP 5.4 :)

+0

太棒了,非常感謝:)編輯:不幸的是我得到了同樣的錯誤。但我會研究這一點。 – Hardist

+0

沒問題。這是什麼版本的PHP? – Will

+0

請參閱我對5.4版以下版本的編輯。 – Will