我正在尝试将使用Laravel 5创建的两个网站合并为一个多站点(是的,我在做出这个决定时并不是那么有经验)。这两个网站是一个用于猫,一个用于狗。
我的问题是我有一个名为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);
}
但它一直出错:
语法错误,意外的'::'(T_PAAMAYIM_NEKUDOTAYIM)
但是,如果我这样做:
public function index()
{
$class= $this->items_class;
$items = $class::all();
}
它可以工作..但是我不希望在控制器方法中有额外的变量。
我想知道为什么第一个不起作用。如果有人对如何让这个多站点工作的方式比这个更好,那么我愿意接受建议。谢谢。
答案 0 :(得分: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