Laravel验证SMTP服务器设置

问题描述:

我想在我的Laravel应用程序中使用SwiftMailer验证SMTP服务器设置。Laravel验证SMTP服务器设置

我的主要问题是,如果SMTP服务器验证失败,我希望它以与$this->validate()相同的方式将用户返回到带有错误消息的窗体。

这里是相同的示例代码,所以你可以看到我想要做的事:

public function update($id) 
{ 
    $this->validate(request(), [ 
     "name" => "required|unique:email_servers,name,$id", 
     "address" => "required|unique:email_servers,address,$id", 
     "username" => "required", 
     "password" => "nullable|confirmed", 
     "security" => "nullable|exists:email_securities,value", 
     "host" => "required", 
     "port" => "required", 
    ])->after(function ($validator) { 
     try{    
      if (request()->input('security')) { 
       $transport = Swift_SmtpTransport::newInstance(request()->input('host'), request()->input('port'), request()->input('security')); 
      } 
      else { 
       $transport = Swift_SmtpTransport::newInstance(request()->input('host'), request()->input('port')); 
      } 

      $transport->setUsername(request()->input('username')); 
      $transport->setPassword(request()->input('password')); 
      $mailer = \Swift_Mailer::newInstance($transport); 
      $mailer->getTransport()->start(); 
     } 
     catch (Swift_TransportException $e) { 
      $validator->errors()->add('transport_exception', $e->getMessage()); 
     } 
     catch (Exception $e) { 
      $validator->errors()->add('exception', $e->getMessage()); 
     } 
    }); 

    $email_server = EmailServer::findOrFail($id); 
    $email_server->update(array_filter(request()->all())); 

    activity()->by(auth()->user())->on($email_server)->withProperties($email_server)->log('Updated Email Server'); 
    request()->session()->flash('status', 'Email Server updated!'); 

    return redirect()->route('backend.email_servers'); 
} 

现在,很明显这不起作用为$this->validate()没有after()回调。

如何按照我想要的方式进行此项工作,以便如果我要使用Validator::make,它将采用与$this->validate()相同的方式?

我想通了通过看ValidatesRequests特点:

$validator = Validator::make(request()->all(), [ 
     "name" => "required|unique:email_servers", 
     "address" => "required|unique:email_servers", 
     "username" => "required", 
     "password" => "required|confirmed", 
     "security" => "required|exists:email_securities,name", 
     "host" => "required", 
     "port" => "required", 
    ]); 
    $validator->after(function ($validator) { 
     $transport_status = $this->transportStatus(); 

     if ($transport_status != 'OK') { 
      $validator->errors()->add('transport_status', $transport_status); 
     } 
    }); 

    if ($validator->fails()) { 
     $this->throwValidationException(request(), $validator); 
    } 
    else { 
     $email_server = EmailServer::create(request()->all()); 

     activity()->by(auth()->user())->on($email_server)->withProperties($email_server->toArray())->log('Created Email Server'); 
     request()->session()->flash('status', 'Email Server created!'); 

     return redirect()->route('backend.email_servers'); 
    } 

public function transportStatus() 
{ 
    try { 
     $security = (request()->input('security') != 'None') ? request()->input('security') : null; 
     $transport = Swift_SmtpTransport::newInstance(request()->input('host'), request()->input('port'), $security); 
     $transport->setUsername(request()->input('username')); 
     $transport->setPassword(request()->input('password')); 
     $mailer = \Swift_Mailer::newInstance($transport); 
     $mailer->getTransport()->start(); 

     return 'OK'; 
    } 
    catch (Swift_TransportException $e) { 
     return $e->getMessage(); 
    } 
}