【问题标题】:Laravel 5.5 Validation MessageLaravel 5.5 验证消息
【发布时间】:2018-12-17 08:52:15
【问题描述】:

我有一个方法:

protected function validateLogin(Request $request)
{
    $this->validate($request, [
        'email' => 'required|string|exists:users,email,active,1,online,0',
        'password' => 'required|string',
    ], [
        'password.required' => 'Password required!',
        'email.exists' => 'Email not found!',
    ]);
}

这验证了“用户”表中的数据库中存在具有特定电子邮件地址的用户,该用户处于活动状态且未登录。 'users' 表的架构如下:

Schema::create($this->table, function (Blueprint $table) {
    $table->increments('id');
    $table->string('first_name');
    $table->string('last_name');
    $table->string('email')->unique();
    $table->string('password');
    $table->boolean('active')->default(true);
    $table->boolean('online')->default(false);
    $table->timestamps();
});

我想根据用户的状态(在线|活动)返回错误消息

你能告诉我我该怎么做吗? 我试过了:

protected function validateLogin(Request $request)
{
    $this->validate($request, [
        'email' => 'required|string|exists:users,email,active,1,online,0',
        'password' => 'required|string',
    ], [
        'password.required' => 'Password required!',
        'email.exists' => 'Email not found!',
        'email.active' => 'User not active!',
        'email.online' => 'Email is onlone!',
    ]);
}

【问题讨论】:

  • Laravel 中的验证并不是这样工作的;它验证发送到服务器的输入,而不是在数据库中找到的记录的值。除非 exists 方法做一些不同的事情;从来没有真正使用过。
  • $this->validate 中将$request 替换为$request->all()
  • 类型错误:传递给 App\Http\Controllers\Controller::validate() 的参数 1 必须是 Illuminate\Http\Request 的实例,给定数组...
  • Custom validation rules 可以使用。另见this question
  • 我同意@TimLewis,验证适用于输入的数据,而不是数据库中的数据。

标签: laravel validation


【解决方案1】:

首先,您需要提供FormRequest的解决方案,如下sn-p所示:

namespace App\Http\Requests;

use Illuminate\Support\Facades\Auth;

/**
 * Class UserRequest
 * @package App\Http\Requests
 */
class UserRequest extends Request
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return !Auth::check();
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'email' => 'required|unique:users|email_active:email@me.com|email_online:email@me.com',
            'password' => 'required|string|between:4,40'
        ];
    }

    public function messages()
    {
        return [
            'email.required' => 'Email is required',
            'email.unique' => 'This Email is already in use',
            'email.email_active' => 'This email is not active',
            'email.email_online' => 'This email is online',
            'password.required' => 'Password is required',
            'password.between' => 'Password length should be between :min and :max characters'
        ];
    }
}

email_active 和 email_online 是两条不适用于 Laravel box 的规则。您应该通过 php artisan make:rule EmailActiveRule 和 php artisan make:rule EmailOnlineRule 创建它们。

做完之后,你需要按照这个答案的过程来扩展你的规则

规则形成后,需要通过Repository或Model查看数据库中的记录。

希望这个解决方案对你有用!

【讨论】:

    【解决方案2】:

    我真的不知道exists:users,email,active,1,online,0 是否有效。我会从数据库中获取活动或在线字段,然后相应地返回一条消息。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2018-01-31
      • 2018-09-13
      • 1970-01-01
      • 2014-05-31
      相关资源
      最近更新 更多