我想使用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
所以逻辑路径应该是:
目前我还不清楚第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
。
答案 0 :(得分:0)
在您的示例中,一个重要问题是您将如何使用这些数据。由于您没有表现出我会假设您没有理由使用/ sensors / Sensorname / data,因为对于每个传感器,您需要创建一条新路线。
似乎最好的选择是保持安静的方法,例如创建一个/温度路径,你可以像往常一样拥有POST,PUT,DELETE或GET,并且你会添加一个参数来描述从哪个传感器到数据来自。这样你就可以拥有相同的路径,如果真的需要,你可以拥有多个解析器。