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();
}
}