2016-01-22 2 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) 

Мой вопрос в том, могу ли я сом ehow использовать переменные в любом случае в методе меток, используя конструкцию, или, может быть, лучший способ это сделать?

ответ

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) { // ... } 

Но тогда вы не могли получить доступ к private или protected членов; это будет рассматриваться как открытый доступ. Вам действительно нужен PHP 5.4 :)

+0

Awesome, спасибо большое :) Редактировать: К сожалению, я получаю ту же ошибку. Но я посмотрю на это. – Hardist

+0

Нет проблем. Какая версия PHP это? – Will

+0

См. Мои изменения о версиях ниже 5.4. – Will