2016-01-05 2 views
1

Я пытаюсь объединить два веб-сайта, созданных с использованием Laravel 5, в один мультисайт (да, я не был таким опытным при принятии такого решения). Эти два веб-сайта предназначены для кошек и для собак.Laravel, выбирая класс во время выполнения

Моя проблема заключается в том, что у меня есть модель под названием Item, одна в котах хранит вещи в другом столе, чем модель Item у собак.

То, что я сделал в моем контроллере:

protected $posts_class; 

public function __construct() 
{ 
    $this->items_class = "App\\Models\\" . config('domain') . "\\Item"; 
} 

public function index() 
{ 
    $items = $this->items_class::all(); 
    return view('items')->with('items', $items); 
} 

но продолжает давать ошибку:

syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

однако, если я:

public function index() 
{ 
    $class= $this->items_class; 
    $items = $class::all(); 
} 

это работает .. но Я не хочу дополнительных переменных в методе контроллера.

Хотелось бы знать, почему первый не работает. Если у кого-нибудь есть рекомендации относительно того, как сделать эту многоуровневую работу лучше, чем эта, тогда я открыт для предложений. Спасибо.

ответ

0

Оператор T_PAAMAYIM_NEKUDOTAYIM более известен как Оператор разрешения диапазона. В контексте PHP он используется для статического доступа к методам и переменным класса.

Метод all() - это статический метод класса Eloquent, на который унаследует ваша модель. Таким образом, его следует называть как ClassName::all().

Если я понимаю, что вы пытаетесь сделать правильно, вы пытаетесь использовать динамическую переменную в качестве имени класса. К сожалению, использование $this->someVariable::all() не совсем работает так, как можно было бы ожидать такого, и, как вы знаете, сначала нужно разделить его на индивидуальную переменную.

В духе ответа на ваш вопрос напрямую, чтобы назвать его без создания отдельной переменной, ответ заключается в использовании часто забытого метода forward_static_call.

$items = forward_static_call([$this->items_class, 'all']); 

Если вам нужно вызвать статический метод с использованием этой методики и хотят передать массив параметров, есть также Связанная функция forward_static_call_array().

Ссылка:

http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php

http://php.net/manual/en/function.forward-static-call.php

http://php.net/manual/en/function.forward-static-call-array.php

+0

Спасибо! Это объясняет, почему то, что у меня есть, не работает. Это не аккуратный код для использования forward_static_call каждый раз, когда я использую модель в контроллере. – mrsparrow

Смежные вопросы