【发布时间】:2019-09-10 18:15:43
【问题描述】:
我不知道是我睡眠不足还是遗漏了一些明显的东西,但我遇到了这个问题:我创建了一个自定义验证规则,我需要通过构造函数传递一个请求值来执行验证.
这是我的设置:
自定义验证规则
/** Rules/RouteValidationRule.php */
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class RouteValidationRule implements Rule {
private $action;
public function __construct(string $action)
{
$this->action = $action; // doing dd($action) output the correct value.
}
// a dd('Hi'); inside here is just ignored:
public function passes($attribute, $value)
{
if ($this->action === 'complete')
return (isset($value['delivery_route']))
&& (count($value['delivery_route']) >= 2);
else
return true;
}
public function message() { /** */ }
}
表单请求
/** UpdateOrderRequest.php */
namespace App\Http\Requests;
use App\Rules\OrderStatusesRule;
use App\Rules\RouteValidationRule;
use Illuminate\Foundation\Http\FormRequest;
class UpdateOrderRequest extends FormRequest {
public function authorize() { /** */ }
public function rules()
{
return [
'action' => ['required', new OrderStatusesRule],
'meta.delivery_route' => [
'array',
new RouteValidationRule($this->get('action')), // <---
],
];
}
}
但问题是,该值正在到达自定义规则构造函数,但它没有到达 passes() 方法,它只是忽略了这一点并继续进行,就好像这没问题一样。
PD:我已经用dd()检查了每一步。
提前致谢。
更新
/** MyController.php */
/**
* @param UpdateOrderRequest $request
* @return mixed
*/
public function handle(UpdateOrderRequest $request) // the RequestForm is injected
{
dd('I passed'); // <-- is reaching this statement when it shouldn't
}
【问题讨论】:
-
你也可以粘贴控制器处理方法吗?也可能是您的请求验证在上一步失败,因此由于快速退出策略而无法达到您的验证规则?
-
@Tacsiazuma 就是这样,它正在通过验证并到达控制器。我会按照建议添加相关代码。
-
如果您检查控制器中的请求,它是否包含提到的字段?如果添加“必需”作为规则会发生什么?
-
@Tacsiazuma 如果我在该属性中添加
required作为规则,它会在丢失时失败(如预期的那样)但是当我添加参数并重做请求时,它通过required但忽略passes()自定义规则。是的,属性到达控制器,这真的很奇怪
标签: php laravel validation laravel-5.8