2017-04-05 23 views
1

未來在功能我控制器我稱之爲:Laravel驗證數據從我自己的應用程序和數據庫

$item = Item::where('i_id', $Id)->where('type', 1)->first(); 


$firebaseData = app('firebase')->getDatabase()->getReference('items/'.$Id)->getSnapshot()->getValue(); 

然後我做了很多來自兩個源上面的數據之間的「驗證」像:

if ($item->time_expires < strtotime(Carbon::now()) && $firebaseData['active'] == 1) { 
return response()->json(['errors' => [trans('api.pleaserenew')]], 422); 
} 

而且,由於這不是數據從用戶/請求來的時候不能使用Laravels validate方法

我做nt想要在我的控制器中保存這種邏輯,但我應該在哪裏放置它?由於我的部分數據來自Firebase,因此我無法設置一個Eloquent模型來處理它。

回答

0

對於您的應用程序中的任何數據,您都可以使用Laravel驗證。

可以使用驗證器的外觀類似這樣的合併數據並對其進行處理:

$combinedData = array_merge($item->toArray(), $firebaseData); 

Validator::make($combinedData, [ 
    'active' => 'required|in:1', 
    'time_expires' => 'required|before:' . Carbon::now()->toDateTimeString() 
], $customMessageArray); 

我認爲這個代碼的最好的地方是某種服務類的,你會注入到控制器或使用Laravel其他服務類依賴注入。

1

我建議通過方法來接收模型中的火力點數據:

public function getFirebaseData() 
{ 
    app('firebase')->getDatabase()->getReference('items'/ . $this->i_id)->getSnapshot()->getValue(); 
} 

你要接收來自控制邏輯分離的數據邏輯和它移動到它更有意義的方式。添加驗證方法可以在模型中的工作相若方式則:

public function validateData() 
{ 
    $combined = array_merge($this->toArray(), $this->getFirebaseData()); 

    Validator::make($combined, [ 
     'active' => 'in:1', 
     'time_expires' => 'before:' . Carbon::now(), 
    ]); 
} 

與此需要說明的是,驗證錯誤將模型的,而不是在控制器內被拋出,但真的不應該是一個問題我不沒想到。

相關問題