Laravel在运行时选择一个类

时间:2016-01-05 23:59:26

标签: php laravel model

我正在尝试将使用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();
}

它可以工作..但是我不希望在控制器方法中有额外的变量。

我想知道为什么第一个不起作用。如果有人对如何让这个多站点工作的方式比这个更好,那么我愿意接受建议。谢谢。

1 个答案:

答案 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