2016-04-27 133 views
1

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

这个调用在我把它放在其他方法中时就起作用了,而不是从理想上需要的构造函数中调用。

访问低于母引发 “致命错误:在供应商\ laravel \框架调用一个成员函数get()方法在空的\ src \照亮\ HTTP \ Request.php:601”

protected $test= []; 

    public function __construct(myRepositoryInterface $myRepository) { 

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

在类中创建一个init()方法并从构造函数中调用它。 – Gala

+0

问题是在'parent :: has'或'parent :: input'中,或者两者都有!基于这个错误,我敢打赌,在父对象的某个地方,通常定义的东西没有被定义,而且laravel正在尝试使用该值来调用某些东西。它并没有真正与'parent ::'调用本身有很大关系,因为我第一次怀疑:) – aaronofleonard

+0

@Amleonard是的,我同意,我的想法是,直到构造函数完成它的工作,我不能正确访问这些方法。我可以在另一个方法中调用完全相同的代码,它可以工作,但在构造函数中失败。谢谢。 – jiraiya

回答

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...)并运行你自己的逻辑。

+2

非常感谢托马斯,这真的帮了我很多。我非常感谢。 – jiraiya

+0

我曾尝试使用$ this-> has()也和父母一起查看问题的原因,以防万一它帮助任何人。 – jiraiya

0

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

+1

对不起,我说得太快了。它停止错误,但方法只返回空值,看起来内容是无法访问的,直到构造函数完成其工作。 – jiraiya

相关问题