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">
,  
и т.д.
// 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;
}