【问题标题】:Laravel: Why is my variable not being set while it's in the construct function of the controller?Laravel:为什么我的变量在控制器的构造函数中没有被设置?
【发布时间】:2017-02-06 09:23:22
【问题描述】:
class Controller extends BaseController
{
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs,    ValidatesRequests;
    private $host;
    private function __construct()
    {
        $environment = App::environment();
        if ($environment == "local"){
            $this->host = config('customs.localHost');
        }
        else if ($environment == "prod"){
            $this->host = config('customs.productionHost');
        }
    }

    public function getHost()
    {
        return $this->host;
    }
}

上面是我在 Laravel 中的控制器。这是主控制器,我在其他控制器类中扩展了这个控制器。基本上我想在这个控制器中创建一个方法,根据我当前的环境返回当前主机。

我正在从其他控制器调用函数 getHost(),但是我得到了 null。

现在 __construct() 中的代码,如果我把它放在 getHost() 方法中它可以工作。但是我的问题是为什么 __construct() 中的代码没有被执行?

【问题讨论】:

  • 您的构造函数必须是公共的,或者由类本身调用(例如在单例中)。
  • 我已经公开了,但是代码仍然没有被执行。
  • 请看这个网址laravel.io/index.php/forum/…
  • 我认为需要在构造函数方法上传递参数

标签: php laravel constructor controller


【解决方案1】:

你必须打电话

parent::__construct();

在子类构造函数中。 并且超类构造函数不能是私有的

【讨论】:

    【解决方案2】:

    我想当我扩展控制器时它会自动初始化。

    class WSUsersController extends Controller
    {
    }
    

    我必须在调用 getHost() 方法之前初始化我的控制器。

    $controller = New Controller();
    $result['campaignRequest'] = $controller->getHost();
    

    【讨论】:

    • 每个控制器在向它发出请求时都会被初始化,我想每个写答案的人都认为你这样做了(例如get /getHostRoute::get('getHost', 'WSUsersController@getHost'))。当从您的代码中调用getHost 时,您当然需要初始化它(如果它不是静态方法)
    • 所以基本上当我从路由调用方法时它会被初始化,如果我从我的代码调用方法(即使我正在扩展类)我需要初始化它通过 (parent::__construct())。
    • 当调用一个路由时,框架会为你实例化它。您需要考虑的是getHost 是否真的应该在控制器中。也许 Laravel 的 ServiceProvider 可以胜任!
    【解决方案3】:

    更改属性 $host 的可见性:

    public $host;
    

    以及函数__construct的可见性:

    public function __construct()
    

    然后在你的子类构造函数中:

    parent::__construct();
    

    【讨论】:

    • 你在子类构造函数中调用parent::__construct();了吗?
    • 是的,我打电话给 parent::__construct();在我的子类构造中,它起作用了。
    • 属性$host的可见性可以改为private,并且function__construct()应该是public的。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    相关资源
    最近更新 更多