为啥发送电子邮件并且不出现验证错误? (如果用户不填写主题和消息字段)

Posted

技术标签:

【中文标题】为啥发送电子邮件并且不出现验证错误? (如果用户不填写主题和消息字段)【英文标题】:Why the email is sent and the validation errors are dont appear? (if the user dont fill the subject and message fields)为什么发送电子邮件并且不出现验证错误? (如果用户不填写主题和消息字段) 【发布时间】:2019-01-07 06:12:54 【问题描述】:

我有一个带有选择菜单的页面,以便用户可以选择是否要将电子邮件发送到:

会议的所有参与者 致在会议的特定注册类型中注册的所有参与者 给在会议中注册的特定参与者

但它不能正常工作。

问题:

如果用户选择他想向所有参与者发送电子邮件并且不填写主题和消息字段,则会显示“成功发送通知”,但是应该出现两个验证错误,说明主题和消息字段是必需的.你知道为什么不能那样工作吗?

如果用户选择他想向在会议的特定注册类型中注册的所有参与者发送电子邮件并且也不填写主题和消息字段,则会出现同样的问题。而不是出现验证错误,而是显示“成功发送通知”。

如果用户选择 hew ant 为在会议中注册的特定参与者发送电子邮件并介绍要发送电子邮件的用户的电子邮件并且不填写主题和消息字段,则会出现同样的问题。而不是出现验证错误,而是显示“成功发送通知”。

完整的通知控制器:

class NotificationController extends Controller

    public function index($id)

        $conference = Conference::find($id);
        $registrationType = RegistrationType::where('conference_id', $id)->get();


        return view('notifications.index')->with('conference', $conference)->with('registrationType', $registrationType);
    

    public function send(Request $request, $id)
    
        $conference = Conference::find($id);

        $message = $request->message;
        $subject = $request->subject;
        $emails = [];

        if($request->send_to == "participant")
            $this->validate(request(), $this->participantRules($id));

            $emails = User::whereHas('registrations', function ($query) use($id) 
                $query->where('conference_id', '=', $id);
            )->where('email', $request->email)->pluck('email');
        else if($request->send_to == "all")
            $emails = User::whereHas('registrations', function ($query) use($id) 
                $query->where('conference_id', '=', $id);
            )->pluck('email');
        else
            $emails = User::whereHas('registrations.participants.registration_type', function ($query) use ($id, $request) 
                $query->where('id', '=', $request->send_to)
                    ->where('conference_id', '=', $id);
            )->whereHas('registrations', function ($query) use ($id) 
                $query->where('conference_id', '=', $id);
            )->pluck('email');

        

        if(count($emails) > 0) 
            $this->sendNotification($emails, $conference, $request);
            Session::flash('success', 'Notification sent with success.');
            return redirect()->back();
        else
            Session::flash('no_participants', 'The participant(s) are not registered in the conference.');
            return redirect()->back();
        
    

    protected function participantRules($conferenceID)
        return [
            'email' => 'required|email'
        ];
    

    protected function sendNotification($emails, $conference, $request)
        foreach ($emails as $userEmail) 
            Mail::to($userEmail)->send(new Notification($conference, $request->message, $request->subject));
        
    

【问题讨论】:

【参考方案1】:

验证不起作用,因为您只验证了参与者规则方法中的电子邮件字段(顺便说一下,$id 参数在这里没有用(未使用))。 另外,只有在 send_to 等于“participant”时才调用此方法

protected function participantRules($conferenceID)
    return [
        'email' => 'required|email'
    ];

如果您还想验证主题和消息字段,则必须明确编写有关它们的规则。例如,它可能是:

protected function participantRules($conferenceID)
    return [
        'email' => 'required|email',
        'subject' => 'required',
        'message' => 'required'
    ];

这样,主题和消息字段也将是必需的。此外,您可以传递第三个参数 - 一个数组 - 来覆盖默认消息。

$messages = [
    'email.email' => 'Your email is invalid',
    'email.required' => 'You must enter an email address',
    'subject.required' => 'You must enter a subject'
];
$this->validate(request(), $this->participantRules($id), $messages);

为了以更简洁的方式进行验证,您应该使用form request validation class 而不是进行内联验证,以保持您的代码结构良好。另外,验证规则列表可以在here找到。

只有当 send_to 等于参与者时,您才可以轻松地将电子邮件字段设为必填(如果这是您当然想要做的)。

要实现这一点,只需像这样更改参与者规则方法:

protected function participantRules($conferenceID)
    return [
        'email' => 'required_if:send_to,participant|email|nullable',
        'subject' => 'required',
        'message' => 'required'
    ];

它现在应该使电子邮件字段仅在 send_to == 'participant' 时才需要。在 send_to != 'participant' 的情况下,可为空的规则允许该字段为空。如果省略它,空字段将不会通过电子邮件验证规则(因为它不是有效的电子邮件地址)。

【讨论】:

谢谢,但也不适用于“受保护的函数参与者规则($conferenceID) return [ 'email' => 'required|email', 'subject' => 'required', 'message' = > '必需' ]; "。例如,如果用户选择要为所有参与者发送通知并单击“发送”并且不填写主题和消息,则会显示“成功发送通知”。 消息部分不能在 particpantRules 方法中完成,因为它是第三个参数。参与者规则方法将返回一个且只有一个东西,在你的情况下是一个数组。 不要忘记将 validate 方法放在 if 语句之外。如果不是,它只会在 send_to 是“参与者”时验证:) 喜欢这个? " public function send(Request $request, $id) $conference = Conference::find($id); $message = $request->message; $subject = $request->subject; $emails = []; $ this->validate(request(), $this->participantRules($id)); if($request->send_to == "participant") ..."? 就像出现验证错误信息一样。但是只有当用户在选择菜单中选择“给特定参与者”,即用户想要为特定参与者发送电子邮件时,才需要电子邮件字段。你知道如何纠正吗?因为这样看起来总是需要电子邮件。

以上是关于为啥发送电子邮件并且不出现验证错误? (如果用户不填写主题和消息字段)的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 抛出错误并且不向用户发送确认邮件

firebase 电子邮件验证网站

outlook发送邮件为啥老显示错误

在VC中用PostMessage()发送消息,为啥会发送失败?

为啥通知组件不起作用

设计在更新时不确认电子邮件