在 Laravel 中,访问自定义规则类中的另一个请求输入可以通过几种方式实现。首先,我们需要了解 Laravel 的验证规则和自定义规则的基本概念。
验证规则:Laravel 提供了一系列内置的验证规则,如 required
, email
, min
等,用于验证表单输入数据的合法性。
自定义规则:当内置规则无法满足需求时,可以创建自定义验证规则。自定义规则通常继承自 Illuminate\Contracts\Validation\Rule
接口,并实现 passes
和 message
方法。
假设我们有一个自定义规则,需要验证用户的输入 start_date
是否早于 end_date
。
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class StartBeforeEnd implements Rule
{
public function passes($attribute, $value)
{
return request()->input('start_date') < request()->input('end_date');
}
public function message()
{
return 'The start date must be before the end date.';
}
}
namespace App\Http\Controllers;
use App\Rules\StartBeforeEnd;
use Illuminate\Http\Request;
class MyController extends Controller
{
public function store(Request $request)
{
$request->validate([
'start_date' => ['required', new StartBeforeEnd],
'end_date' => ['required'],
]);
// 处理验证通过后的逻辑
}
}
问题:在自定义规则中访问其他请求输入时,可能会遇到 request()
函数不可用或无法获取到预期值的情况。
原因:request()
函数在某些上下文中可能未被正确绑定,或者自定义规则的实例化时机导致无法访问完整的请求数据。
解决方法:
Request
实例。namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Http\Request;
class StartBeforeEnd implements Rule
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function passes($attribute, $value)
{
return $this->request->input('start_date') < $this->request->input('end_date');
}
public function message()
{
return 'The start date must be before the end date.';
}
}
然后在控制器中使用时:
$request->validate([
'start_date' => ['required', new StartBeforeEnd($request)],
'end_date' => ['required'],
]);
request()
辅助函数,有时需要在文件顶部添加 use Illuminate\Support\Facades\Request;
来引入。通过上述方法,可以有效解决在 Laravel 自定义规则中访问其他请求输入的问题,同时保持代码的清晰和可维护性。
领取专属 10元无门槛券
手把手带您无忧上云