在自定义规则类中访问另一个请求输入 - Laravel

8

我需要在 passes 方法中访问 $request->important。我需要根据这个值验证名称。

class TestCustom implements Rule
{
    public function passes($attribute, $value)
    {
        // 
    }

    public function message()
    {
        return 'some txt';
    }
}

使用方法如下:

use App\Rules\TestCustom;

$request->validate([
    'name' => ['required', new TestCustom],
    'important' => ['required', 'string'],
]);
3个回答

18

最好将数据传递给规则构造函数,并在规则之后使用它。这样您就可以使用规则验证不同的数据源,以防它不是来自请求。

class TestCustom implements Rule
{
    private $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function passes($attribute, $value)
    {
        // Use $this->data['important'] for validation
    }

    public function message()
    {
        return 'some txt';
    }
}

然后将数据传递给规则:

使用 App\Rules\TestCustom;

$request->validate([
    'name' => ['required', new TestCustom($request->all())],
    'important' => ['required', 'string'],
]);

2

使用 Input 外观-

Input::get('important');

2
如果数据不仅来自请求,还来自其他来源怎么办? - Vedmant
3
我不需要尝试就能看出这是个坏主意,更好的方法是在规则构造函数中传递请求数据,比如像这样:new TestCustom($request->all())。否则,该规则将无法与其他来源的数据验证重复使用。 - Vedmant
在 Laravel >= 6.x 中,现在使用 Request::input('important');。https://laravel.com/docs/6.x/upgrade#the-input-facade但是,当从 implements Rule->passes() 中使用时,会出现错误消息“不应静态调用 Illuminate\Http\Request::input() 方法”。 - Henk Poley

0

Laravel版本 ^8.0

Laravel使用DataAwareRule接口的setData方法非常容易。访问附加数据的文档

    /**
     * Set the data under validation.
     *
     * @param  array  $data
     * @return $this
     */
    public function setData($data)
    {
        $this->data = $data;

        return $this;
    }

完整示例:

use Illuminate\Contracts\Validation\DataAwareRule;
use Illuminate\Contracts\Validation\Rule;

class TestCustom  implements Rule, DataAwareRule
{

   
    protected $data = [];

    /**
     * Set the data under validation.
     *
     * @param  array  $data
     * @return $this
     */
    public function setData($data)
    {
        $this->data = $data;

        return $this;
    }

    public function passes($attribute, $value)
    {
        dd($this->data);
    }
   
    public function message()
    {
        return 'The validation error message.';
    }
}

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