2014-12-10 2 views
0

Laravel 4.2를 사용하여 일종의 데이터 로거를 개발하고 싶습니다. 온도 데이터 만있는 온도 센서 ("TemperatureSensor1")와 에너지 및 전력 데이터 (함께있는 두 개의 데이터 열)가있는 에너지 모니터 ("EnergyMonitor1")와 같이 다양한 데이터 형식을 가진 다양한 종류의 센서가 시스템에 있습니다.).Laravel - 다른 모델/데이터 유형으로 데이터 로거 구현

외부 응용 프로그램 (서버에서 실행)은 이러한 데이터를 수집하고 HTTP POST 및/sensors/TemperSensor1/data와 같은 경로를 사용하여 Laravel 응용 프로그램에 게시합니다. 이 HTTP POST의 본문은 JSON 요청으로 구성됩니다. 온도 센서의 경우이 온도는 { "온도": 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 
... 

다음과 같습니다 "센서"라는 테이블도있다 :이 예에서는

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

그래서 논리적 경로는 다음과 같아야합니다

  1. 센서 데이터는 외부에 의해 수집 앱.
  2. Laravel의 HTTP POST 앱/센서/센서 고유의 JSON 데이터가 포함 된 데이터.
  3. Laravel 앱은 '센서'표가있는 경우 표를 찾습니다. JSON 데이터는 "data_type"필드에 따라 예를 들어 구체적인 모델로 전달됩니다. data_type = 0 -> TemperatureSensorModel 또는 data_type = 1 -> EnergyMonitorModel. 참고 : 시스템에 많은 온도 센서가있을 수 있습니다. 이들 모두는 저장된 데이터가있는 다른 이름과 테이블을 가지고 있지만 "TemperatureSensorModel"이 공통입니다.
  4. 콘크리트 모델은 데이터를 "디코딩"하여 센서 별 테이블에 저장합니다.

3 단계는 현재 나에게 다소 불투명합니다. Laravel에서 어떻게 할 수 있습니까? 이러한 종류의 다형성 관계 (data_type에 따라 다른 동작)와 같은 냄새가 있지만 예제가 적합하지 않다고 생각합니다.

이런 종류의 응용 프로그램을 구현하는 또 다른/더 좋은 전략이 있습니까?

편집

내가 데이터로 수행 할 작업을 더 명확하게하려면, 뷰가해야/센서/{Sensorname}/데이터 /보기를 호출 (또는 같은 것을)으로

수집 된 데이터의 플롯을 포함해야하는 렌더링됩니다. 온도 도표가 에너지 도표와 다르기 때문에 모든 센서 유형에 대해 다른보기가 존재합니다.

뷰에는 데이터베이스에서 플롯 데이터를 가져와야하는 JS 플로팅 구성 요소에 대한 참조가 포함됩니다. 이 작업은 JSON 형식의 테이블 "Sensorname"(예 : "TemperatureSensor1")의 기록 된 데이터를 생성하는/sensors/{Sensorname}/data의 AJAX 요청으로 수행 할 수 있습니다.

나는 약간의 실험이 내가 함께 제공된 것입니다 :

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을 수신합니다.

+0

다형성 관계가 정확히 필요한 것입니다. 이것은 본질적으로 공통된 데이터로 다양한 센서 유형을 가질 수있는 감사 테이블입니다. –

답변

0

예제에서 중요한 문제는 데이터를 어떻게 사용할 것인가입니다. 각 센서에 대해 새로운 경로를 만들어야하기 때문에/sensors/Sensorname/data를 사용할 이유가 없다고 가정 할 것입니다.

평소와 같이 POST, PUT, DELETE 또는 GET을 할 수있는/온도 경로 생성과 같은 편안한 접근 방법을 선택하는 것이 가장 좋은 방법 인 것처럼 보입니다. 데이터는에서 왔습니다. 이 방법으로 항상 동일한 경로를 사용할 수 있으며 실제로 필요한 경우 여러 개의 구문 분석기를 사용할 수 있습니다.

+1

원래 게시물에 몇 가지 정보와 가능한 접근법을 추가했습니다. 당신 말이 맞습니다,/센서/Sensorname/데이터를 사용할 진짜 이유가 없습니다. 이것은 내가 염두에 두었던 것이며 IMHO가이 사용 사례에 가장 잘 어울릴 것입니다. 모든 센서 유형에 대해 다른 경로를 사용하면 더 많은 코드가 복제됩니다 (필자는 생각합니다). 이것이 내가 SensorModelFactory에 대해 생각한 이유입니다. 그런 다음 새로운 구체적인 모델 (파서)을 추가하고 팩토리 클래스를 업데이트하면됩니다. – Andre

+0

아직도 나에게는 이상하게 보입니다. 당신은 규모가 있고 당신이/무게 경로를 만들 것입니다 무언가의 무게를 저장하려는 경우에는 내가 자동으로 처리하는 척도를 사용하고있어 또는 내가 수동으로 데이터를 추가하는 경우. 그건 당신이 저장하는 실제 데이터 대신에 참조로 센서를 사용하여, 그것은 나에게 이상하게 보입니다. 따라서/sensors/{Sensorname}/data/view 대신/temperature 및/energy를 사용하면 필요한 모든 데이터를 나열 할 수 있습니다. 그러나 나는 당신의 비즈니스 요구를 실제로 얻지 못했을 것입니다. –

+1

당신이 맞습니다. 제 첫 번째 접근법을 사용하면 개발 과정에서 많은 어려움을 겪게됩니다. 모든 센서 유형에 대해 서로 다른 경로를 사용하는 RESTful 접근 방식이 더 적합합니다. – Andre

관련 문제