Laravel 5.5传递变量到子控制器返回总是null?

时间:2017-10-26 10:16:24

标签: php laravel laravel-5 laravel-5.5

我有一个主控制器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也在那里......

有人可以给我一个想法吗,我在这里做错了什么?

3 个答案:

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