2014-09-25 19 views
0

我期待在Laravel文檔,我看到這個片段:PHP/Laravel的魔法,這是如何工作的?

class UserController extends BaseController { 

    /** 
    * The layout that should be used for responses. 
    */ 
    protected $layout = 'layouts.master'; 

    /** 
    * Show the user profile. 
    */ 
    public function showProfile() 
    { 
     $this->layout->content = View::make('user.profile'); 
    } 

} 

,我們可以清楚地看到這 - $>佈局=「layouts.master」。然而,他們定義的佈局對象(我的理解僅僅是一個基礎PHP字符串,而沒有一個叫內容字段,通過一個孩子......

$this->layout->content = View::make('user.profile');

  1. 哪有一個字符串都定義了一個名爲內容字段

  2. 當我繼承BaseController並嘗試爲其賦值 $這個 - >佈局 - >內容,爲什麼會出現以下錯誤:「嘗試 分配的財產非對象「?

+0

該代碼片段不能單獨使用。另一個類正在改變'$ layout'(通過setter方法),或者代碼片段完全錯誤。鏈接到你發現這個的文檔? – 0b10011 2014-09-25 19:45:45

+2

http://laravel.com/docs/master/templates這是他所指的文檔。 – mschuett 2014-09-25 19:51:04

回答

6

爲什麼不看BaseController?它看起來像他們改變$this->layout

https://github.com/laravel/laravel/blob/master/app/controllers/BaseController.php

<?php 

class BaseController extends Controller { 

    /** 
    * Setup the layout used by the controller. 
    * 
    * @return void 
    */ 
    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 

} 

我的建議是,如果你使用的PHP框架,不要害怕,以檢查其來源,當你不明白爲什麼它的工作原理。通常比你想象的要少得多「魔力」...

IMO,這似乎是一個糟糕的設計,雖然初始化變量爲一個字符串,然後將其更改爲一些對象。只是濫用寬鬆的打字。

+1

爲「*檢查其來源*」和「*不良設計*」+1。 – DCoder 2014-09-25 20:07:27

+0

我不會去壞設計。乍一看非常令人困惑,但它是一個非常簡單的修復。你可以改變受保護的$ layout ='layouts.master';保護$ view ='layouts.master';並檢查setupLayout中的view是否爲空。對我來說糟糕的設計是如果他們很難改變這一點。 – mschuett 2014-09-25 20:38:13

+2

@mschuett,是的,你可以改變它,這可能是一個很好的設計(至少更好)。但事實上,這是一個已發佈的框架,並且已經以令人困惑的方式進行了設計和記錄。但我們只是在爭論「設計」的定義,我認爲我們同意它應該有所不同。 – Matt 2014-09-25 22:38:03