Я хочу разработать своего рода регистратор данных, используя Laravel 4.2. В системе существуют различные типы датчиков с различными форматами данных, например: датчик температуры («TemperatureSensor1») только с данными о температуре и монитор энергии («EnergyMonitor1») с данными об энергии и мощности (два столбца данных, которые принадлежат друг другу) ).
Внешнее приложение (работающее на сервере) собирает эти данные и отправляет их в приложение Laravel, используя HTTP POST и маршрут, подобный следующему: / sensor / 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
Таким образом, логический путь должен быть:
Шаг 3 мне пока неясен. Как бы я сделал это в Laravel? Этот вид пахнет как полиморфное отношение (различное поведение в зависимости от data_type), но я не думаю, что примеры подходят.
Есть ли другая / лучшая стратегия для реализации такого рода приложений?
РЕДАКТИРОВАТЬ
Чтобы было более понятно, что я хочу сделать с данными:
Вызывая / sensor / {Sensorname} / data / view (или что-то в этом роде), необходимо отобразить View, который должен содержать график собранных данных. Обратите внимание, что для каждого типа датчика существует другое представление, потому что температурный график отличается от энергетического графика.
Представление содержит ссылку на компонент построения JS, который должен получать данные графика из базы данных. Это может быть выполнено с помощью AJAX-запроса / сенсоров / {Sensorname} / data, который выдаст зарегистрированные данные таблицы «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;
}
}
Это, кажется, делает работу на данный момент. Я получаю бетон $sensor_model
из SensorModelFactory на основе data_type, который хранится в базе данных таблицы «Датчики».
На вашем примере одна важная проблема заключается в том, как вы собираетесь использовать данные. Поскольку вы не объяснили, что я предполагаю, что у вас нет причин использовать / сенсоры / Sensorname / data, поскольку для каждого датчика вам нужно будет создать новый маршрут.
Кажется, что лучшим вариантом было бы сохранить спокойный подход, такой как создание / температурного маршрута, где вы можете иметь POST, PUT, DELETE или GET как обычно, и вы бы добавили параметр, описывающий, с какого датчика поступили данные , Таким образом, у вас всегда будет один и тот же маршрут, и вы можете иметь несколько парсеров, если вам это действительно нужно.
Других решений пока нет …