【发布时间】: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
所以逻辑路径应该是:
- 外部应用收集的传感器数据。
- HTTP POST 到 Laravel 应用程序 /sensors/Sensorname/data 以及传感器特定的 JSON 数据。
- 如果存在,Laravel 应用程序会在表“传感器”中查找。根据字段“data_type”,JSON 数据被转发到具体模型,例如data_type=0 --> TemperatureSensorModel 或 data_type=1 --> EnergyMonitorModel。 注意:系统中可能有很多温度传感器。它们都具有不同的名称和存储数据的不同表,但具有共同的“TemperatureSensorModel”。
- 具体模型“解码”数据并将其存储在传感器特定表中。
目前我还不清楚第 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