将Laravel请求作为整体进行验证

4
我希望您能够验证给定的讲座。有一些验证规则,但我想通过编写一个验证函数来扩展它,该函数将以3个属性作为参数,并检查数据库中的其他讲座,如果没有讲座重叠,则返回有效。讲座具有开始和结束的DateTime属性。
验证函数是:
private function noOtherLecturesOnGivenTime($start, $end, $hall)
{
    if(!$start instanceof Carbon) {
        $start = new Carbon($start);
    }

    if(!$end instanceof Carbon) {
        $end = new Carbon($end);
    }

    if(is_null($hall)) {
        return true; // if there is no hall defined, all times are acceptable
    }

    if(!$hall instanceof Model) {
        /** @var Hall $hall */
        $hall = Hall::find($hall);
    }
    $overlappingLectures = $hall->lectures()->get()->filter(function ($lecture) use ($start, $end) {
        // (Ts < e) and (Te > s)
        return $start->lt($lecture->end) and $end->gt($lecture->start);
    });

    return $overlappingLectures->count() === 0;
}

我不知道在哪里放置此函数,以便Laravel的验证器抛出异常,并且我可以使用i18n指定错误消息。
谢谢。
1个回答

1

请查看有关自定义验证规则的文档。

从创建规则到指定错误消息,其中有一个完整的示例:

Laravel自定义验证规则文档

对于您的情况,您可以在验证方法中从请求中获取参数。

我认为即使其他参数未设置,验证规则仍将发生,请不要忘记检查它们是否在请求中。


我正在阅读这个内容,但我不想将它赋给请求的任何属性。我希望在所有验证规则都通过后再运行该函数。但我不想自己格式化422 - 无法处理的实体(因此在验证钩子不适用之后)。 - Tomáš Hrušo
你是通过请求传递 $end $end $hall 吗?只需在自定义验证规则中获取你的请求以获取参数并使用你的函数。 - jeanj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接