【问题标题】:Access parent class methods from within child class constructor从子类构造函数中访问父类方法
【发布时间】:2016-04-27 14:15:54
【问题描述】:

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

当我把它放在其他方法中时调用才有效,而不是来自理想需要的构造函数。

访问下面的父级会触发“致命错误:在 vendor\laravel\framework\src\Illuminate\Http\Request.php:601 中调用一个成员函数 get() on null”

    protected $test= [];

    public function __construct(myRepositoryInterface $myRepository) {

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

【问题讨论】:

  • 在类中创建一个init()方法,并从构造函数中调用。
  • 问题出在parent::hasparent::input,或两者兼有!基于错误,我敢打赌,在父对象的某个地方,通常定义的东西没有被定义,而 laravel 正在尝试使用该值调用某些东西。正如我最初怀疑的那样,它与parent:: 调用本身并没有太大关系:)
  • @Amleonard 是的,我同意,我的想法是,在构造函数完成其工作之前,我无法正确访问这些方法。我可以在另一种方法中调用完全相同的代码并且它可以工作,但是在构造函数中它失败了。谢谢。
  • @jiraiya 我明白了。无论如何,我确信它可以正确访问这两个属性,否则你得到的错误将来自那个特定的脚本,而不是来自 laravel 的内部。对我来说,这意味着在构造函数完成之前,父类中的依赖项不能“就位”。我很难说:)。 Gala 的建议效果如何?
  • @Amleonard 是的,我尝试了 Gala 的解决方案,但结果相同,错误相同。我认为下面的答案可能已经确定了,但值返回为空。必须是您建议的框架。似乎构造函数必须在您访问它之前完成。

标签: php laravel laravel-5


【解决方案1】:

有一些问题。

首先,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方法无关,与构造函数有关。

其次,您应该调用$this->has(),而不是调用parent::has()

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

【讨论】:

  • 非常感谢 Thomas,这对我帮助很大。我非常感谢。
  • 我也曾尝试使用 $this->has() 和 parent 来查看问题所在,以防它对任何人有所帮助。
【解决方案2】:

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

【讨论】:

  • 不抱歉,我说得太早了。它停止了错误,但方法只返回空值,在构造函数完成工作之前似乎无法访问内容。
猜你喜欢
  • 1970-01-01
  • 2017-06-28
  • 2019-05-21
  • 2016-05-27
  • 2014-12-16
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多