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

时间:2018-07-30 23:01:16

标签: php laravel

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

  • 会议的所有参与者
  • 以特定会议注册类型注册的所有参与者
  • 针对在会议中注册的特定参与者

但是它不能正常工作。

问题:

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

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

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

完整NotificationController:

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 个答案:

答案 0 :(得分:1)

验证不起作用,因为您仅验证了subjectRules方法中的电子邮件字段(顺便说一句,此处的$ id参数是无用的(未使用))。 此外,只有在send_to等于“参与者”时,您才调用此方法。

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等于参与者时(您当然要这么做),您可以轻松地将电子邮件字段设为必填字段。

要实现这一点,只需像下面那样更改partnerRules方法:

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

现在,仅当send_to =='participant'时,才应将电子邮件字段设为必填。如果send_to!='participant',则可为空的规则允许该字段为空。如果您省略它,则空白字段将不通过电子邮件验证规则(因为它不是有效的电子邮件地址)。