Как проверить запрос с хэшированным значением для существующего в столбце таблицы? - PullRequest
0 голосов
/ 04 июля 2018

Я хэшировал имя пользователя в моей таблице. Как я могу использовать этот метод проверки для хэшированных значений:

'name' => 'required|unique:users'

Пример запроса с именем пользователя: Джон

Пример существующего имени пользователя в таблице: RndqMUU5ZUJnQ2JhWjZvNUh5ZGp2UT09

Я думаю, что сначала я должен хэшировать входное значение из запроса, а после проверки я прав? Где я могу хешировать и проверять эти значения?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Вы можете передать закрытие для проверки, а затем вы можете проверить хэшированное значение.

$validator = Validator::make($request->all(), [
    'name' => [
        'required',
        'max:255',
        function($attribute, $value, $fail) {
            if (Hash::check($attribute) === $value) {
                return $fail($attribute.' is invalid.');
            }
        },
    ],
]);
0 голосов
/ 04 июля 2018

Насколько я знаю, нет встроенного правила проверки, которое сначала хэширует значение.

Вы всегда можете написать собственное правило:

$rules = [
   'name' => [ 
        'required', 
        function($attribute, $value, $fail) {
            if (User::find(Hash::make($value))) {
               return $fail('The username already exists');
            }
        },
];

Вы также можете переместить это правило за пределы, если вы часто его используете, например Вы можете добавить его в свой поставщик услуг:

 public function boot() {
    Validator::extend('uniqueHashedUser', function ($attribute, $value, $parameters, $validator) {
        if (User::find(Hash::make($value))) {
           return false;
        }
       return true;
    });
 }

Тогда вы можете просто использовать его как:

 $rules = [ "name" => 'required|uniqueHashedUser' ]; 
0 голосов
/ 04 июля 2018

Вы можете использовать check метод Хеш-фасада , из документов :

use Illuminate\Support\Facades\Hash;

// some code

if (Hash::check('plain-text', $hashedElement)) {
    // The elements match...
}

Теперь вы можете использовать это в Пользовательском Правиле Проверки :

1. Создание правила класса

php artisan make:rule HashedNameCheck

2. Настроить класс

Приложение \ Правила \ HashedNameCheck.php

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Hash; // <-- notice.

class HashedNameCheck implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        // here you get the hashed name stored in your database (?)
        $hashedName = App\User::find(1)->name;

        // next, you compare this with the received value.
        return Hash::check($value, $hashedName);
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute does not match with the stored value.';
    }
}

3. Применить правило.

Используйте это в вашем контроллере:

$request->validate([
    // some other validation rules..
    'name' => ['required', 'unique:users', new HashedNameCheck],
]);

или по вашему заказу Форма запроса Класс:

public function rules()
{
    return [
        // some other validation rules..
        'name' => ['required','unique:users', new HashedNameCheck],
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...