【问题标题】:Laravel - Implementing a data logger with different models/data typesLaravel - 实现具有不同模型/数据类型的数据记录器
【发布时间】:2015-02-08 12:15:57
【问题描述】:

我想使用 Laravel 4.2 开发一种数据记录器。系统中有不同类型的传感器,具有不同的数据格式,例如:温度传感器(“TemperatureSensor1”)仅具有温度数据和能量监视器(“EnergyMonitor1”)具有能量和功率数据(两个数据列属于一起) )。

一个外部应用程序(在服务器上运行)收集这些数据,并使用 HTTP POST 和如下路由将它们发布到 Laravel 应用程序:/sensors/TemperatureSensor1/data。这个 HTTP POST 的主体包含一个 JSON 请求,对于温度传感器,这将是 {"temperature": 12.3},或者对于能量监视器,这将是 {"energy": 10000.3, "power": 123.3}。 Laravel 应用程序应该将每个传感器的每个数据集存储在 MySQL 数据库中。我想过每个传感器有一个表来存储数据点。在这个例子中:

Table "TemperatureSensor1":

id | timestamp | temperature
1  | 123       | 12.3
...

Table "EnergyMonitor1":

id | timestamp | energy  | power
1  | 128       | 10000.3 | 123.3
...

还有一个名为“sensors”的表格,如下所示:

id | sensor_name        | alias       | data_type
1  | TemperatureSensor1 | Living room | 0
2  | EnergyMonitor1     | House       | 1

所以逻辑路径应该是:

  1. 外部应用收集的传感器数据。
  2. HTTP POST 到 Laravel 应用程序 /sensors/Sensorname/data 以及传感器特定的 JSON 数据。
  3. 如果存在,Laravel 应用程序会在表“传感器”中查找。根据字段“data_type”,JSON 数据被转发到具体模型,例如data_type=0 --> TemperatureSensorModel 或 data_type=1 --> EnergyMonitorModel。 注意:系统中可能有很多温度传感器。它们都具有不同的名称和存储数据的不同表,但具有共同的“TemperatureSensorModel”。
  4. 具体模型“解码”数据并将其存储在传感器特定表中。

目前我还不清楚第 3 步。我将如何在 Laravel 中做到这一点?这种闻起来像多态关系(不同的行为取决于 data_type),但我认为这些示例不合适。

是否有其他/更好的策略来实现这种应用程序?

编辑

为了更清楚我想对数据做什么:

通过调用 /sensors/{Sensorname}/data/view(或类似的东西),应呈现一个视图,其中应包含收集的数据图。请注意,对于每种传感器类型,存在不同的视图,因为温度图看起来与能量图不同。

视图包含对 JS 绘图组件的引用,该组件应从数据库中获取绘图数据。这可以通过 /sensors/{Sensorname}/data 的 AJAX 请求来完成,这将产生 JSON 格式的表“Sensorname”(例如“TemperatureSensor1”)的记录数据。

我做了一些实验,结果是这样的:

我有一个资源控制器和一个嵌套资源控制器,如下所示:

Route::resource('sensors', 'SensorController');
Route::resource('sensors.data', 'SensorDataController');
...

class SensorDataController extends BaseController {

    public function store($id) {
        $sensor = Sensor::where('sensor_id', $id)->first();
        $sensor_model = SensorModelFactory::fromSensor($sensor);

        // do something with $sensor_model
    }
}

class SensorModelFactory
{
    public static function fromSensor($sensor)
    {
            $sensor_model = null;

            if ($sensor)
            {
                    switch ($sensor->data_type)
                    {
                            case TemperatureSensor::DATA_TYPE:
                                    $sensor_model = new \TemperatureSensor;
                    }

                    if ($sensor_model)
                            $sensor_model->setTable($sensor->sensor_id);
            }

            return $sensor_model;
    }
}

现在这似乎可以完成这项工作。我根据存储在数据库表“传感器”中的 data_type 从 SensorModelFactory 收到具体的$sensor_model

【问题讨论】:

  • 多态关系正是你所需要的。它本质上是一个审核表,可以包含许多不同的传感器类型,所有这些传感器类型都具有通用数据。

标签: php laravel logging polymorphism


【解决方案1】:

在您的示例中,一个重要问题是您将如何使用数据。由于您没有解释我会假设您没有理由使用 /sensors/Sensorname/data,因为对于每个传感器,您都需要创建一条新路线。

似乎最好的选择是保持安静的方法,例如创建一个 /temperature 路由,您可以像往常一样在其中进行 POST、PUT、DELETE 或 GET,并且您将添加一个参数来描述来自哪个传感器数据来自。这样你总是有相同的路由,如果你真的需要的话,你可以有多个解析器。

【讨论】:

  • 我在原始帖子中添加了一些信息和一种可能的方法。你是对的,没有真正的理由使用 /sensors/Sensorname/data。这正是我的想法,恕我直言最适合这个用例。为每种传感器类型使用不同的路由会重复更多代码(我认为)。这就是我想到 SensorModelFactory 的原因。然后我只需要添加一个新的具体模型(解析器)并更新工厂类。
  • 这对我来说仍然很奇怪。如果您有秤并且想要存储某物的重量,我会创建 /weight 路线,尽管我使用秤来自动处理它,或者如果我正在手动添加数据。也就是说,使用传感器作为参考而不是您存储的实际数据,这对我来说似乎很奇怪。因此,我不会使用 /sensors/{Sensorname}/data/view 而是使用 /temperature 和 /energy 来列出我需要的所有数据。但我想我并没有真正了解您的业务需求。
  • 你说得对,使用我的第一种方法在进一步的开发过程中会产生很多困难。为每种传感器类型提供不同路由的 RESTful 方法更有意义。
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多