PHP 逻辑不符合预期

PHP Logic Not What is Expected

我正在向我的 Laravel 5.1 站点添加条件验证。实际验证有效,但我的逻辑似乎从未按预期工作。

我的表单上有三个复选框,每个复选框在选中时都应提供 true 的值。这没有问题。

问题出在我的验证中,如下面的代码所示。无论复选框是否选中,测试总是 returns false。我有下面的代码验证器。

$validator->sometimes('email', 'required|email|max:255|unique:members,email', function($request) {
            return $request->input('email_newsletter') === 'true';
        });

更新: 下面是 var_dump($request->input('email_newsletter')); 的完整输出,其中选中了电子邮件复选框:

    object(Illuminate\Support\Fluent)#205 (1) { ["attributes":protected]=> array(8) { ["_token"]=> string(40) "arWeDoYSBUPDh6TnD2CI7xPbg5xfG4lyiCFjh1ZF" ["name"]=> string(0) "" ["email"]=> string(0) "" ["phone"]=> string(0) "" ["email_newsletter"]=> string(4) "true" ["text_message"]=> string(5) "false" ["call_message"]=> string(5) "false" ["input"]=> string(16) "email_newsletter" } }

传递给 Closure 用于验证的参数是包含输入的 Illuminate\Support\Fluent 对象,而不是 Illuminate\Http\Request 对象。您只需直接将信息作为属性访问,无需调用任何方法:

$validator->sometimes('email', 'required|email|max:255|unique:members,email', function($input) {
    return $input->email_newsletter === 'true';
});

之前,当您使用语句 $request->input('email_newsletter') 时,所有这一切实际上是将对象的 input 属性设置为 'email_newsletter',然后 returns Fluent 对象,然后用于比较。您可以在添加的转储中看到这一点,数组中的最后一个属性是 ["input"]=> string(16) "email_newsletter".

您可以阅读文档 here。该部分末尾的红色框表示传递到闭包中的对象。