Laravel-实现具有不同模型/数据类型的数据记录器


Laravel - Implementing a data logger with different models/data types

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

外部应用程序(在服务器上运行(收集这些数据,并使用HTTP POST和如下路由将它们发布到Laravel应用程序:/sensors/TemperatureSensor1/data。此HTTP POST的正文由JSON请求组成,对于温度传感器,这将是{"温度":12.3},或者在能量监视器的情况下,这将是{"能量":10000.3,"功率":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
...

还有一个名为"传感器"的表,如下所示:

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

所以逻辑路径应该是:

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

目前,我有些不清楚第 3 步。我在拉拉维尔该怎么做?这种闻起来像多态关系(根据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;
    }
}

这似乎暂时可以完成这项工作。我从传感器模型工厂收到一个具体的$sensor_model,该基于存储在数据库表"传感器"中的data_type。

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

似乎最好的选择是保持休息的方法,例如创建一个/speed 路由,您可以在其中像往常一样进行 POST、PUT、DELETE 或 GET,并且您将添加一个参数来描述数据来自哪个传感器。这样,您始终具有相同的路由,并且如果您确实需要,则可以拥有多个解析器。