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

时间:2014-12-10 10:30:17

标签: php laravel logging polymorphism

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

外部应用程序(在服务器上运行)收集这些数据,并使用HTTP POST和以下路由将它们发布到Laravel应用程序:/ sensors / TemperatureSensor1 / data。这个HTTP POST的主体包含一个JSON请求,对于温度传感器,这将是{"温度":12.3}或者在能量监视器的情况下,这将是{"能量" :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. 使用传感器特定的JSON数据向Laravel app / sensors / Sensorname / data发送HTTP POST。
  3. Laravel应用程序查看表格#34;传感器"如果它存在取决于字段" data_type"将JSON数据转发到具体模型,例如data_type = 0 - > TemperatureSensorModel或data_type = 1 - > EnergyMonitorModel。 注意:系统中可能有很多温度传感器。所有这些都有不同的名称和不同的表与存储的数据,但有" TemperatureSensorModel"共同的。
  4. 具体模型"解码"数据并将它们存储在特定于传感器的表中。
  5. 目前我还不清楚第3步。我怎么在Laravel做这个?这种气味就像多态关系(不同的行为取决于data_type)但我不认为这些例子适合。

    是否可能有其他/更好的策略来实施此类应用程序?

    修改

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

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

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

    我试验了一下,这就是我的意思:

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

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

    这似乎是现在的工作。我根据存储在数据库表" sensors"中的data_type从SensorModelFactory收到一个具体的$sensor_model

1 个答案:

答案 0 :(得分:0)

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

似乎最好的选择是保持安静的方法,例如创建一个/温度路径,你可以像往常一样拥有POST,PUT,DELETE或GET,并且你会添加一个参数来描述从哪个传感器到数据来自。这样你就可以拥有相同的路径,如果真的需要,你可以拥有多个解析器。