Laravel多字段自定义验证规则并处理业务逻辑

Laravel多字段自定义验证规则并处理业务逻辑,laravel,laravel-validation,Laravel,Laravel Validation,我正在研究一个端点,该端点的数据相互依赖,以确定其是否有效。输入的数据如下所示: { job: 123 activity: 345 date: 2021-01-01 } 我需要对各个字段进行一些检查,这些检查对我来说都是有意义的。但我还需要做涉及多个字段的检查。例如,作业中存在活动。或者某项活动在给定日期有效。对于这些类型的验证,我需要访问多个字段,并且尽我所能,我只能告诉您真正了解要验证的字段 下面是我要创建的规则类,用于检查活动在给定数据上是否有效 <?php

我正在研究一个端点,该端点的数据相互依赖,以确定其是否有效。输入的数据如下所示:

{
    job: 123
    activity: 345
    date: 2021-01-01
}
我需要对各个字段进行一些检查,这些检查对我来说都是有意义的。但我还需要做涉及多个字段的检查。例如,作业中存在活动。或者某项活动在给定日期有效。对于这些类型的验证,我需要访问多个字段,并且尽我所能,我只能告诉您真正了解要验证的字段

下面是我要创建的规则类,用于检查活动在给定数据上是否有效

<?php

namespace App\Rules;


use Carbon\Carbon;
use Illuminate\Contracts\Validation\Rule;

class ValidAcitivityOnDate implements Rule
{
    /**
     * @var Carbon
     */
    protected $date;

    public function __construct(Carbon $date)
    {
        $this->date = $date;
    }

    public function passes($attribute, $value)
    {
        //Some logic here based on the activity and date
        return false;
    }

    public function message()
    {
        return 'The activity is not valid for {$this->date->toDateString()}.';
    }
}
第一个问题是,我是否正确地处理了这个多字段验证?是否应该通过在规则的构造函数中添加其他字段来完成

第二个问题是,这是否是正确的方法?我以前没有使用过Laravel验证器,但它们似乎是放置验证逻辑的合乎逻辑的地方。但我看到的每一个示例都没有依赖于多个字段的验证。我看到的验证更侧重于“数据的形式是否正确”,而我的验证则是“数据是否满足某些业务逻辑”

为了进一步补充这一点,一些验证很可能需要服务类和存储库来获取检查验证所需的一些信息。我可以根据需要将它们传递给构造函数,但感觉很快就会变得混乱

我认为最终的解决方案需要是服务类方法和验证器的组合。这些验证检查将在多个地方重复使用,从外观上看,它们很快就会变得一团糟。因此,使用一个服务类方法来包含所有看起来是正确的选择(这也是我在尝试验证程序之前的想法)。但是在验证器中包含实际的验证逻辑似乎也是一个好主意


我想知道我是不是离开了基地。或者我应该让验证器进行简单的输入检查,而业务逻辑验证应该放在服务类中吗?

如果您的代码有更多的业务逻辑,您应该转向自定义规则。别再想了。如果没有自定义规则验证,请不要让您的验证变得丑陋有一个表单请求,您可以在每个控制器操作中使用它问:自定义规则,上面的解决方案是使用自定义规则,还是完全独立?我的印象是,我包含的ValidAcitivityOnDate类是一个自定义规则,但不是100%确定。回复:表单请求,这可能是一个选项。但我也需要在控制器之外进行验证。至少,队列作业也需要它,同时在几个不同的控制器中重复使用它。因此,我现在的重点是如何最好地封装基本验证。好的,您可以使用自定义规则,并在任何地方调用它(控制器带有
validate()
),(repo,service;使用
passes()
函数作为条件)。也许是一个验证数据的服务,你可以在任何地方调用该服务,也可以在自定义规则或表单请求中调用该服务,你明白了吗?@PsyLogic,我明白你的意思。规则是这个验证逻辑的正确位置,所以把它放在那里。然后,您可以通过调用pass在控制器和validate中使用它,或在服务(或任何其他地方)中使用它。现在看来,这将是一个组织化的想法,希望我们能在今后的道路上获得更多的额外的美好
$rule = new ValidAcitivityOnDate(new Carbon($request->input('date')));
$validator = Validator::make($request->input(), ["activity" => ["required", $rule]]);
$validatedData = $validator->validate();