2016-04-27 142 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

相關問題