Php 派生属性未从父构造函数初始化
在我的通用控制器GeneralController中:Php 派生属性未从父构造函数初始化,php,laravel,oop,laravel-5,derived-class,Php,Laravel,Oop,Laravel 5,Derived Class,在我的通用控制器GeneralController中: use App\Http\Controllers\Controller; class GeneralController extends Controller { protected $onLine = null; public function __construct(Request $request) { $this->onLine = OnLine::domain($request-&g
use App\Http\Controllers\Controller;
class GeneralController extends Controller
{
protected $onLine = null;
public function __construct(Request $request)
{
$this->onLine = OnLine::domain($request->domain)->first();
}
}
use App\Http\Controllers\OnLine\ItemController;
class ItemController extends GeneralController
{
public function getItem(Request $request)
{
dd($this->onLine); // but returns null :(
}
}
在我的另一个控制器中,扩展了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();
}
}
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()代码>返回数据,它会这样做。父构造函数将帮助您
class ItemController extends GeneralController
{
public function __construct()
{
parent::__construct();
....
}
}
我不知道你对请求->域有什么期望。这是一个输入还是您希望当前域
如果这是一个输入,那是正确的。如果您想要当前域,您应该使用parse\u url($request->url(),PHP\u url\u HOST)
使用->first()
(或find()
)方法时,如果查询返回0结果,“first”的值将为null
class GeneralController extends Controller
{
protected $onLine;
public function __construct(Request $request)
{
$this->onLine = OnLine::domain($request->domain)->first();
}
}
你的代码没有问题。我猜你忘了发送“域名”
为了便于调试,只需使用硬编码的值更改构造函数(而不是发送$request->domain,使用“OnLine”表中已有的任何值)
之后,检查$request中是否有任何值<代码>dd($request->all())
;如果这是一个空数组,则表示您忘记发送域
并确保使用use-lighted\Http\Request代码> 这是您的ItemController中的输入错误吗
use App\Http\Controllers\OnLine\ItemController;
它应该是GeneralController,对吗?因为`OnLine::domain($request->domain)->first();`ItemController文件中是否为Null不应该使用App\Http\Controllers\OnLine\GeneralController而不是ItemController?或者它与您尝试扩展的类不同?对不起,我的英语不好(下一票:如果子类中省略了构造函数,则隐式调用父构造函数)。注意:如果子类定义构造函数,则不会隐式调用父构造函数。要运行父构造函数,请调用父构造函数::\u construct()在子构造函数中是必需的。“@PhilippMaurer我刚刚测试过,在Laravel controller中没有调用父构造函数。而且,看起来这对OP有效,所以我向上投票。也许你应该自己测试并删除向下投票?