从子类构造函数中访问父类方法

时间:2016-04-27 14:15:55

标签: php laravel laravel-5

我使用的是Laravel 5.3。在我的扩展请求类的表单请求中,我试图从父类访问方法,但它抛出一个错误,我似乎无法理解为什么。我的表单请求构造函数如下所示。我在这里错过了什么吗?

当我把它放在其他方法中时,调用工作,而不是从理想情况下需要的构造函数中调用。

访问下面的父项触发“致命错误:在供应商\ laravel \ framework \ src \ Illuminate \ Http \ Request.php:601”

中调用null上的成员函数get()
    protected $test= [];

    public function __construct(myRepositoryInterface $myRepository) {

        $this->myRepository= $myRepository;
        if( parent::has('someName') ){
           $this->test= $myRepository->someMethod(parent::input('someName'));
       }
   }

2 个答案:

答案 0 :(得分:2)

有一些问题。

首先,Laravel的Form Request类是Symfony的Request类的子类。如果你看看那个类,它有这个构造函数:

public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
{
    $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
}

您创建了自己的构造函数并更改了Request类的行为,从根本上打破了它。您不接受超类所需的任何参数。

Call to a member function get() on null给了我们一个线索。这是调用get()的函数:

protected function retrieveItem($source, $key, $default)
{
    if (is_null($key)) {
        return $this->$source->all();
    }

    return $this->$source->get($key, $default);
}

您的$source为空。 $source可以是headers属性,因为您的新构造函数为null。该错误与父类'has方法无关,也与构造函数无关。

其次,您应该拨打parent::has()

,而不是致电$this->has()

最后,我会从构造函数中取出它。在其他地方初始化您的存储库。如果由于某种原因确实需要将它放在构造函数中,请尝试接受所有其他参数,然后接受存储库。记得致电parent::__construct(...parameters...)并运行自己的逻辑。

答案 1 :(得分:0)

你可能忘记在子构造函数中调用parent :: __ construct()了吗?