2017-09-24 84 views
1

我想实现的Laravel的新功能“自定义验证规则”之一,我遇到了以下错误:Laravel自定义验证 - Mailgun API

Object of class Illuminate\Validation\Validator could not be converted to string 

我按照此步骤视频: New in Laravel 5.5: Project: Custom validation rule classes (10/14)

这是一个尝试Mailgun API的电子邮件验证工具。

请求简单的形式:姓,名,公司,电子邮件和消息

这里是我的代码:

web.php

Route::post('contact', '[email protected]'); 

StaticPageController.php

use Validator; 
use App\Http\Validation\ValidEmail as ValidEmail; 

public function postContact(Request $request) { 
     return Validator::make($request->all(), [ 
      'firstname' => 'required|max:90', 
      'lastname' => 'required|max:120', 
      'company' => 'max:120', 
      'email' => [ 
       'required', 'string', 'max:255', 
       new ValidEmail(new \GuzzleHttp\Client) 
      ], 
      'message' => 'required', 
     ]); 
} 

ValidEmail.php

<?php 

namespace App\Http\Validation; 

use Illuminate\Contracts\Validation\Rule; 
use GuzzleHttp\Exception\GuzzleException; 
use GuzzleHttp\Client as Guzzle; 

class ValidEmail implements Rule 
{ 
    protected $client; 
    protected $message = 'Sorry, invalid email address.'; 

    public function __construct(Guzzle $client) 
    { 
     $this->client = $client; 
    } 

    public function passes($attribute, $value) 
    { 
     $response = $this->getMailgunResponse($value); 
    } 

    public function message() 
    { 
     return $this->message; 
    } 

    protected function getMailgunResponse($address) 
    { 
     $request = $this->client->request('GET', 'https://api.mailgun.net/v3/address/validate', [ 
      'query' => [ 
       'api_key' => env('MAILGUN_KEY'), 
       'address' => $address 
      ] 
     ]); 
     dd(json_decode($request->getBody())); 
    } 
} 

期望

我期待看到这样的事情:

{ 
    +"address": "[email protected]" 
    +"did_you_mean": null 
    +"is_disposable_address": false 
    +"is_role_address": false 
    +"is_valid": false 
    +"parts": { 
     ... 
    } 
} 

任何帮助深表感谢。我一直试图让这个简单的例子现在工作两个多小时。希望有我的经验的人可以帮忙!

+0

我得到它的工作,你还需要吗? – user3253002

回答

0

在你的控制器

试试这个:

$validator = Validator::make($request->all(), [ 
    'firstname' => 'required|max:90', 
    'lastname' => 'required|max:120', 
    'company' => 'max:120', 
    'email' => [ 
     'required', 'string', 'max:255', 
     new ValidEmail(new \GuzzleHttp\Client) 
    ], 
    'message' => 'required', 
]); 


if ($validator->fails()) { 
    return redirect()->back() 
     ->withErrors($validator) 
     ->withInput(); 
} 

// if valid ... 
+0

我试过这个'如果($ validator-> failed()){ 返回重定向() - >返回() - > withErrors($ validator) - > withInput(); } else { return“Valid”; }'仍然是相同的 – sogeniusio

0

根据您的路线,该postContact方法是处理路由的方法。这意味着此方法的返回值应该是您想要查看的响应。

您正在返回一个Validator对象,然后Laravel试图将其转换为响应的字符串。 Validator对象不能转换为字符串。

您需要执行验证,然后根据验证返回正确的响应。您可以在documenation here中阅读更多关于手动验证器的信息。

总之,你需要的是这样的:

public function postContact(Request $request) { 
    $validator = Validator::make($request->all(), [ 
     'firstname' => 'required|max:90', 
     'lastname' => 'required|max:120', 
     'company' => 'max:120', 
     'email' => [ 
      'required', 'string', 'max:255', 
      new ValidEmail(new \GuzzleHttp\Client) 
     ], 
     'message' => 'required', 
    ]); 

    // do your validation 
    if ($validator->fails()) { 
     // return your response for failed validation 
    } 

    // return your response on successful validation 
} 
+0

试过这个,仍然是相同的if($ validator-> failed()){ return redirect() - > back() - > withErrors($ validator) - > withInput() ; } else { return“Valid”; }' – sogeniusio