2016-01-05 44 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