2017-03-29 420 views
0

我試圖做我的網站控制器這樣Laravel 5.4 - 請查看登錄錯誤

class MyController extends BaseController { 

public function login() 
{ 
    $this->layout->testata = View::make('OUT'); 
    $this->layout->content = View::make('auth.login'); 
} 

但Laravel說:「嘗試給非對象的屬性」。 什麼問題?

Basecontroller只具有構造器

class BaseController extends Controller { 

    public $layout = 'a.main'; 
    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 

} 

問題出在哪裏?

+1

當您嘗試設置它們不存在的屬性時,您的班級不分配佈局。創建你自己的setupLayout函數,或者從BaseController而不是Controller繼承。 – mkaatman

+0

'$ layout'被定義爲BaseController中的字符串,但它在登錄函數中被稱爲對象。此外,由於MyController不擴展BaseController,因此MyController中甚至沒有'$ layout'。 –

+0

我複製粘貼時發生錯誤。是類MyController擴展BaseController {但不起作用 – Santoo

回答

0

在您的BaseController中,您有一個名爲$layout的屬性,其默認值爲a.main,它是一個字符串。

在你的方法loginMyController類要設置$layout財產testatacontent財產。但是,$layout屬性持有什麼?它持有一個字符串a.main。該字符串不是既沒有testata屬性也沒有content屬性的對象。這就是你得到這個錯誤的原因。

現在,您可以聲稱您正在將屬性設置爲setupLayout方法BaseController中的對象。但問題是,當setupLayout被調用?沒有簽名,$layout屬性持有的任何對象沒有初始默認值a.main

作爲一種快速解決方法,您可以在BaseController的構造函數中調用setupLayout方法,以便在啓動BaseController時設置$layout屬性。東西如下:

class BaseController extends Controller { 

    public $layout = 'a.main'; 

    public function __construct(){ 
     parent::__construct(); 
     $this->setupLayout(); 
    } 

    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 
} 

此外,爲了解決這個你應該添加$layout變量初始化爲對象stdClass(Standard class of PHP)使$layout屬性是沒有更多的non-object。然後你可以設置你的testatacontent

$this->layout = new \stdClass; //or new stdClass(); 
$this->layout->testata = View::make('OUT'); 
$this->layout->content = View::make('auth.login'); 
+0

謝謝,但如果我添加函數__construct()我有同樣的問題 – Santoo

+0

感謝您的反饋。回答編輯。檢查出來,請讓我知道。 – Imran

+0

Class'App \ Http \ Controllers \ stdClass'找不到 – Santoo