【问题标题】:Laravel logic for implementing models with different methodsLaravel 使用不同方法实现模型的逻辑
【发布时间】:2016-06-03 05:22:52
【问题描述】:

有史以来的第一篇文章 :) 我正在学习 Laravel 5,并希望以“正确的方式”做一些事情。

我想用 php/Laravel 即闪电管理我所有的家庭自动化系统。

我有许多类型的闪电控制,即 X10、Philips Hue 和 Belkin WeMo。每种类型都有不同的方式来打开/关闭/亮度/等。

我目前有一个"type" = hue||wemo||x10 的“Light”模型,但我不想这样做:

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...
}

然后,为每种类型的闪电设置不同的类和/或方法。

我读到了 eloquent 的关系(一对一、多态和其他),但我没有看到大局。

在 Laravel 5/Eloquent 中执行此操作的正确方法是什么?

【问题讨论】:

  • 您如何在数据库中管理此灯的开或关我的意思是您在数据库中是否有任何字段值,例如 1 表示开或 0 表示关等?
  • 我在数据库中确实有一个布尔值is_on 字段用于所有灯,并且每次触发手动打开/关闭操作时都会更新此值。我还有一个 cron 作业更新 wemo 和 hue 灯的这个值,因为它们可以按需返回状态,但不能返回 x10。一切都由命令行控制,每种类型的灯都有不同的命令,我需要的是一种在任何类型的灯上简单地从我的 LightsController 调用 $Light->open() 的方法,并触发适当的命令(不使用 '在type 上切换'或'假设')。

标签: php interface model laravel-5


【解决方案1】:

检查 laravel 中的依赖注入概念。那可能对你有帮助。 Like this

【讨论】:

  • 我会读这个...看起来很有希望。谢谢。会让你知道的。
【解决方案2】:

所以我为我的项目找到的解决方案非常简单:

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 Model 和 Light_type Models 即 Light_x10、Light_hue 等的数据库关系。

所有 Light_type 型号都实现相同的接口,并且都有不同的代码用于开关、调光等。

编辑:急切加载不适用于此“解决方案”...我仍在寻找真正的答案

【讨论】:

  • 不幸的是,这不适用于急切加载:(
【解决方案3】:

稍微深入研究 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");
    }
}

...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多