Laravel 5.2中控制器类的单继承


Single Inheritance of Controller Classes in Laravel 5.2

您好,我正在尝试在Laravel 5.2中为控制器做单继承。

这是我的父基控制器类

 <?php
 namespace App'Http'Controllers'Moviesfrontend;
 use Illuminate'Http'Request;
 use App'Http'Requests;
 use App'Http'Controllers'Controller;

 class BaseController extends Controller
 {
     public function __construct($request)
     {
         //code to check whether city is set in session or not
         $selectedcity=$request->session()->get('selectedcity');
     }
 }

在BaseController类构造将获取存储在会话中的城市名称。现在我想访问这个城市名称存储在$selectedcity在我的子类。

我的子控制器类是
  <?php
  namespace App'Http'Controllers'Moviesfrontend;
  use Illuminate'Http'Request;
  use App'Http'Requests;
  use App'Http'Controllers'Controller;
  class HomeController extends BaseController
  {
      public function __construct(Request $request)
      {
          parent::__construct($request);
      }
      public function index(Request $request)
      {
          echo $selectedcity;
      }
  }

默认情况下,我猜父类变量可以访问子类,但这是不工作的,我得到错误消息,$selectedcity没有找到。

您的$selectedcity是一个局部变量。它只存在于构造函数的函数作用域中。它将在构造函数被调用后消失。你需要把它赋值给一个实例变量,例如

class BaseController extends Controller
{
    protected $selectedCity;
    public function __construct($request)
    {
        $this->selectedCity = $request->session()->get('selectedcity');
        …
然而,这将使任何从BaseController派生的子类都可以访问。如果这是您想要的,请按所示操作。

但是从您展示的代码来看,BaseController看起来是多余的。只需删除BaseController并将构造函数移动到HomeController:

class HomeController extends Controller
{
    private $selectedCity;
    public function __construct($request)
    {
        $this->selectedCity = $request->session()->get('selectedcity');
        …

要访问实例变量,你必须通过$this获取它,例如

public function index(Request $request)
{
    echo $this->selectedCity;
    …

如果你不清楚这些主题,一定要阅读PHP手册中的对象继承章节。