Laravel 4: Лучшая практика для подбора входных данных перед валидацией

Теперь я обрезаю каждый вход отдельно, как показано ниже:

$username = trim(Input::get('username'));
$password = trim(Input::get('password'));
$email    = trim(Input::get('email'));

$validator = Validator::make(array('username' => $username, 
                                   'password' => $password, 
                                   'email'    => $email), 
                             array('username' => 'required|min:6', 
                                   'password' => 'required|min:6', 
                                   'email'    => 'email'));

Существует ли какой-либо подход для выполнения Trim одновременно с

Input::all() или Input::only('username', 'password', 'email')?

И какова наилучшая практика для этого?

Ответы

Ответ 1

Примечание. Это решение не будет работать, если какой-либо из ваших входов является массивом (например, "данные []" ).

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

Input::merge(array_map('trim', Input::all()));

Теперь остальное кодирование

$username = Input::get('username'); // it trimed 
// ...
Validator::make(...);

Если вы хотите исключить некоторые входы из обрезки, вы можете использовать следующее вместо all()

Input::except('password');

Или вы можете использовать

Input::only(array('username'));

Обновление. Поскольку входы Laravel 5.4.* обрезаются из-за нового промежуточного программного обеспечения TrimStrings. Таким образом, не нужно беспокоиться об этом, потому что это промежуточное программное обеспечение выполняется по каждому запросу, и оно также обрабатывает входные данные массива.

Ответ 2

В зависимости от вашего проекта ниже может быть слишком навязчивым/обобщенным/etc для ваших нужд; настройте по мере необходимости.

app/helpers.php

/**
 * @param callable $callback
 * @param array    $array
 *
 * @return mixed
 *
 * @link http://php.net/manual/en/function.array-map.php#112857
 */
function array_map_recursive($callback, $array)
{
    foreach ($array as $key => $value) {
        if (is_array($array[$key])) {
            $array[$key] = array_map_recursive($callback, $array[$key]);
        } else {
            $array[$key] = call_user_func($callback, $array[$key]);
        }
    }

    return $array;
}

app/filters.php

App::before(
    function (\Illuminate\Http\Request $request) {
        // Trim all input
        $request->merge(
            array_map_recursive(
                "trim",
                array_except(
                    $request->all(),
                    ["password", "password_confirmation"]
                )
            )
        );
    }
);

Ответ 3

Возможно, вы можете использовать функцию array_map php, чтобы обрезать содержимое вашего входного массива.

$validator = Validator::make(array_map('trim',Input::all()),
                             array('username' => 'required|min:6', 
                                   'password' => 'required|min:6', 
                                   'email'    => 'email'));

Или, если вы хотите использовать переменную, которую вы можете использовать позже:

$inputs = array_map('trim', Input::only('username', 'password', 'email'))

Ответ 4

$attributes = Input::only('username', 'password', 'email');

foreach ($attributes as &$value) {
    $value = trim($value);
    //and any further preprocessing you want
}

$validator = Validator::make($attributes, array(
    'username' => 'required|min:6', 
    'password' => 'required|min:6', 
    'email'    => 'email'
));

//now you may pass preprocessed $attributes to the model create() method,
//still having the original input untouched if you may need it

Обычно я также использую этот подход для замены необязательных значений null, когда они пусты, потому что я предпочитаю хранить их в БД как null, а не пустые строки.

Ответ 5

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

public function setUsernameAttribute($value)
{
  $this->attributes['username'] = trim($value);
}

Таким образом, вам никогда не придется забывать обрезать все атрибуты модели в ваших контроллерах. Модель позаботится об этом, и вам больше не придется об этом беспокоиться.

Что касается обрезки всего сразу и отдельно, я думаю, что разница настолько мала, что никто не заметил бы разницы.

Ответ 6

Лучше всего использовать комбинацию из вышеизложенного. Как правило, вам нужно будет фильтровать все входные данные, кроме полей пароля и пароля_подтверждения. Также делать это с одной строкой в ​​фильтре приятно.

//app/filters.php

App::before(function($request)
{
    // Trim all input
    Input::merge(array_map('trim', Input::except(['password', 'password_confirmation'])));

});

Ответ 7

улучшение кода Halil Özgür, чтобы удалить все пробелы, <br>, <br >, <br class="asdasd">, &nbsp и т.д.

// filters.php
App::before(function (\Illuminate\Http\Request $request) {
    $request->merge(
        array_map_recursive(
            "preg_replace",
            array_except(
                $request->all(),
                ["password", "password_confirmation"]
            )
        )
    );
});

// helpers.php
function array_map_recursive($callback, $array)
{
    foreach ($array as $key => $value) {
        if (is_array($array[$key])) {
            $array[$key] = array_map_recursive($callback, $array[$key]);
        } else {
            $array[$key] = call_user_func_array($callback, ['#(( ){0,}<br( {0,})(/{0,1})>){1,}$#i', '', $array[$key]]);
        }
    }

    return $array;
}