Laravel验证来自我自己的应用程序和数据库的数据

时间:2017-04-05 16:10:30

标签: php 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方法

我不想在我的控制器中保留这种逻辑,但我应该把它放在哪里?由于部分数据来自Firebase,我无法设置Eloquent模型来处理它。

2 个答案:

答案 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依赖注入向控制器或其他服务类注入的某种服务类。