在控制器的功能中,我称之为:
$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
方法
我不想在我的控制器中保留这种逻辑,但我应该把它放在哪里?由于部分数据来自Firebase,我无法设置Eloquent模型来处理它。
答案 0 :(得分:1)
我建议通过模型中的方法接收firebase数据:
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(),
]);
}
需要注意的是,验证错误将在模型中而不是控制器中抛出,但这不应该是我不认为的问题。
答案 1 :(得分:0)
对于您在应用程序中的任何数据,您可以使用Laravel验证。
您可以合并数据并使用Validator Facade处理它,如下所示:
$combinedData = array_merge($item->toArray(), $firebaseData);
Validator::make($combinedData, [
'active' => 'required|in:1',
'time_expires' => 'required|before:' . Carbon::now()->toDateTimeString()
], $customMessageArray);
我认为这段代码的最佳位置是使用Laravel依赖注入向控制器或其他服务类注入的某种服务类。