Laravel 5.2中控制器类的单一继承

时间:2016-09-30 09:07:34

标签: php inheritance laravel-5 controller laravel-5.2

您好我正在尝试在Laravel 5.2 for Controllers中进行单继承。

这是我的父基本控制器类

 <?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;
      }
  }

Bedefault我猜父类变量可以被子类访问,但这不起作用,我收到错误信息,找不到$ selectedcity。

请帮助我在chlid课程中访问此变量。

1 个答案:

答案 0 :(得分:1)

您的$selectedcitylocal variable。它只存在于构造函数的函数范围内。调用构造函数后它将消失。您需要将其分配给instance variable,例如

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;
    …

如果您不清楚这些主题,请务必阅读chapter on Object Inheritance in the PHP Manual