派生 属性 未从父构造函数初始化

Derived property does not get initialized from parent constructor

在我的通用控制器GeneralController中:

use App\Http\Controllers\Controller;
class GeneralController extends Controller
{
    protected $onLine = null;

    public function __construct(Request $request)
    {
        $this->onLine = OnLine::domain($request->domain)->first();
    }
}

在我的另一个控制器中,扩展 GeneralController:

use App\Http\Controllers\OnLine\ItemController;
class ItemController extends GeneralController
{
    public function getItem(Request $request)
    {
        dd($this->onLine); // but returns null :(
    }
}

我已经检查过 OnLine::domain($request->domain)->first(); returns 数据,确实如此。

父构造器来帮你!!

class ItemController extends GeneralController
{
    public function __construct()
    {
         parent::__construct();
         ....
    }
}

我不确定您对 request->domain 有何期待。这是输入还是您期望当前域?

如果这是一个输入,那是正确的。如果你想要当前域,你应该使用 parse_url($request->url(), PHP_URL_HOST).


当你使用->first()(或find())方法时,如果查询return0个结果,'first'的值将为null。

class GeneralController extends Controller
{
    protected $onLine;

    public function __construct(Request $request)
    {
        $this->onLine = OnLine::domain($request->domain)->first();
    }
}

您的代码没有任何问题。我的猜测是您忘记发送 "domain"。

为了更容易调试,只需使用硬编码值更改您的构造函数(而不是发送 $request->domain,使用 "OnLine" table 中已有的任何值)。

之后,检查您是否有来自 $request 的任何值。 dd($request->all());如果这是一个空数组,您忘记发送域了。

并确保使用 use Illuminate\Http\Request;

这是您的 ItemController 中的拼写错误吗?

use App\Http\Controllers\OnLine\ItemController;

应该是GeneralController吧?