【问题标题】:Laravel Custom Validation - Mailgun APILaravel 自定义验证 - Mailgun API
【发布时间】:2017-09-24 03:48:41
【问题描述】:

我正在尝试实现 Laravel 的一项新功能“自定义验证规则”,但遇到了以下错误:

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', 'StaticPageController@postContact');

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": "test@e2.com"
    +"did_you_mean": null
    +"is_disposable_address": false
    +"is_role_address": false
    +"is_valid": false
    +"parts": {
        ...
    }
}

非常感谢任何帮助。我一直试图让这个简单的例子工作两个多小时。希望有我经验的人可以提供帮助!

【问题讨论】:

  • 我搞定了,你还需要这个吗?

标签: laravel validation mailgun


【解决方案1】:

在你的控制器中

试试这个:

$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 ...

【讨论】:

  • 我试过这个` if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } else { 返回“有效”; }` 还是一样的
【解决方案2】:

根据你的路由,postContact方法是处理路由的方法。也就是说这个方法的返回值应该是你想看到的响应。

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

您需要进行验证,然后根据该验证返回正确的响应。您可以在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
}

【讨论】:

  • 试过了,还是一样 ` if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput(); } else { 返回“有效”; }`
猜你喜欢
  • 2020-07-18
  • 2018-06-17
  • 2012-11-27
  • 2015-05-10
  • 1970-01-01
  • 2014-05-31
  • 2017-04-11
  • 2018-05-31
  • 2018-02-18
相关资源
最近更新 更多