我有一个主控制器CmsController,它扩展到默认的laravel控制器:
use App\Http\Controllers\Controller;
class CmsController extends Controller
{
protected $web = null;
public function __construct(Request $request)
{
$this->web = Web::domain($request->domain)->first();
}
}
现在,在此控制器中,我想调用$this->web
use App\Http\Controllers\Web\PageController;
class PageController extends CmsController
{
public function getPage(Request $request)
{
dd($this->web); // returns always null
}
}
应该返回的数据是100%正确的,reqest params也在那里......
有人可以给我一个想法吗,我在这里做错了什么?
答案 0 :(得分:2)
因为您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行,即使您在CmsController构造中执行了dd($this->web);
,您也会得到null所以你可以这样做像这样:
use App\Http\Controllers\Controller;
class CmsController extends Controller
{
protected $web = null;
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->web = Web::domain($request->domain)->first();
return $next($request);
});
}
}
答案 1 :(得分:1)
我认为你需要执行父构造函数:
class PageController extends CmsController
{
public function __construct()
{
parent::__construct();
....
}
}
答案 2 :(得分:0)
您正在延长CmsController
并使用PageController
这就是为什么,
use App\Http\Controllers\Web\CmsController;
class PageController extends CmsController
{
public function getPage(Request $request)
{
dd($this->web); // returns always null
}
}
我改变了,
use App\Http\Controllers\Web\PageController;
到此,
use App\Http\Controllers\Web\CmsController;