2016-02-21 50 views
1

有史以來的第一篇文章:)我正在學習Laravel 5,並且想要做一些「正確的方式」。Laravel用不同方法實現模型的邏輯

我想用php/Laravel管理我所有的家庭自動化系統,即閃電。

我有許多類型的閃電控制,即X10,Philips Hue和Belkin WeMo。每種類型都有不同的方式來打開/關閉/亮度/等。

我現在有一個"type" = hue||wemo||x10「光」的模式,但我不想做的事:

class Light extends Model 
{ 
    function off() 
    { 
     switch $this->type 
     { 
      case'x10': x10_close_light($this->address); break; 
      case'hue': hue_close_light($this->address); break; 
      case'wemo': wemo_close_light($this->address); break; 
     } 
    } 
} 

我寧願有一個像接口:

interface LightInterface 
{ 
    function close(); 
    function open(); 
    function dim($value); 
    function get_status(); 
    etc... 
} 

然後,讓針對每種雷電的不同類別和/或方法。

我讀過關於雄辯的關係(一對一,多態和其他),但我沒有看到這裏的大圖。

在Laravel 5/Eloquent中做到這一點的正確方法是什麼?

+0

你如何開啓或關閉數據庫管理這個角度我是說你有沒有在數據庫中的哪些值像1或0爲關閉等任何領域? –

+0

我在數據庫中有一個布爾型的「is_on」字段,用於所有指示燈,並且每次觸發手動開啓/關閉操作時都會更新此值。我還有一個cron工作,爲wemo和hue燈更新這個值,因爲他們可以按需返回狀態,但不是x10。所有東西都是用命令行來控制的,每種類型的燈都有不同的命令,我需要的是一種簡單的方法,在任何類型的燈光下從我的LightsController中簡單調用$ Light-> open(),並且觸發相應的命令(不使用'開關'或'如果'在'類型'上)。 –

回答

0

多一點點的挖掘到Laravel和我加入另一個[和最後]在這裏回答,因爲我最初的問題的答案是:多態關係

現在我看到了大局。謝謝互聯網。

例如

class Light extends Model 
{ 
    function control() 
    { 
     return $this->morphTo(); 
    } 

    function toggle() 
    {  
     $inverse = ! $this->control->actual_state; 
     $this->control->state($inverse); 
    } 

    function off() 
    { 
     $this->control->state(false); 
    } 

    ... 
} 

然後,

class Light_x10 extends Model 
{ 
    public function state($state) 
    { 
     //... x10 specific coding (I use Mochad) 
    } 
} 

class Light_hue extends Model 
{ 
    public function state($state) 
    { 
     // ... Phillips Hue specific coding (I use hue-cli) 
     // $cmd = $state===false? 'off' : 'on' 
     // exec("hue light {$this->address} $cmd"); 
    } 
} 

... 
0

檢查laravel中的依賴注入概念。這可能會幫助你。 Like this

+0

我會讀這個...看起來很有前途。謝謝。會讓你知道。 –

0

所以,我已經找到了我的項目的解決方案很簡單:

class Light extends Model 
{ 
    function control() 
    { 
     switch($this->type) 
     { 
      case'hue': return $this->belongsTo('App\Light_hue', 'control_id'); 

      case'wemo': return $this->belongsTo('App\Light_wemo', 'control_id'); 

      case'x10': return $this->belongsTo('App\Light_x10', 'control_id'); 
     } 
    } 

    function toggle() 
    {  
     $this->control->toggle(); 
    } 

    function off() 
    { 
     $this->control->toggle(0); 
    } 

    ... 
} 

我只需要有「一個開關塊」來定義每種類型的光的哪種模式。 control_id用於燈型號和Light_ type模型之間的關係DATABSE即Light_x10,Light_hue等

所有Light_ type模型實現相同的接口,它們都具有用於開啓/關閉,調光等不同的代碼

編輯:預先加載不與本「解決方案」工作...我還在尋找一個真正的答案

+0

不幸的是,這對於急切的加載並不適用:( –