2014-03-12 81 views
1

這是一個棘手的問題。Laravel中的自定義setter和getters

我在Laravel構建了一個框架,我希望我的對象能夠以透明的方式與Rackspace進行交互。 從現在起我使我們能夠上傳/刪除對象,而無需考慮Rackspace公司

$model->file = Input::file('thing'); // and it uploads to Rackspace. 

下一步我要實現的是用我的配置文件,以獲得的路由。例如$route = $file->source(例如數據庫中帶有hello.jpg的源文件),並獲取$ route作爲rackspace.com/WHATEVER/hello.jpg。部分rackspace.com/WHATEVER在我的配置文件中,所以我唯一需要的是如何做到這一點。

我一直在廣泛搜索,我只找到__call()方法來做到這一點。 我想這樣的表現的字段是動態的,從數組被設置好的如:

public static $rackspaceable = array('source' => 'images-demo'); 

當圖像 - 演示是Rackspace的容器。

有誰知道要實現這一點,如果它甚至有可能?

回答

0

這可能是你在找什麼:

class Model extends Eloquent { 

    public static $rackspaceable = array('source' => 'images-demo'); 

    public function __get($key) 
    { 
     if (isset(static::$rackspaceable[$key])) 
     { 
      return static::$rackspaceable[$key]; 
     } 

     return parent::__get($key); 
    } 

    public function __set($key, $value) 
    { 
     if (isset(static::$rackspaceable[$key])) 
     { 
      static::$rackspaceable[$key] = $value; 
     } 
     else 
     { 
      parent::__set($key, $value); 
     } 
    } 
} 

要使用它:

$model = new Model; 

var_dump($model->source); 

$model->source = 'new value'; 

var_dump($model->source); 
+0

哇安東尼奧,這是一個偉大的答案!它非常完美!另外,你是否知道從__get($ key)方法訪問$ model-> source的方法?如果我做$ this - > {$ key},我得到一個'code ErrorException:Undefined property:RackFile :: $ source'錯誤。 –

+0

我不認爲你可以,因爲它會導致遞歸調用。 –

+0

嘿!經過4個小時對我的屏幕猛擊我的頭後,我發現了一個使用特徵的酷解決方案。 在特性中,我實現了'code __get($ name)'方法,並檢查getter是否屬於我想要監視的某些字段。結構與此類似: '代碼公共職能__get($名){ 如果($名稱== variableOfInterest){ 回報doSomethingSpecial } 否則返回父:: __得到($名) }' 這樣我可以避免無限遞歸。也許它對別人有幫助! :D 再次感謝你安東尼奧! –