Теперь я обрезаю каждый вход отдельно, как показано ниже:
$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')
?
И для чего лучше всего это делать?
Примечание. Это решение не будет работать, если какой-либо из ваших входов является массивом (например, «данные []»).
Вы можете попробовать это, обрезать с помощью этой одной строки кода перед проверкой:
Input::merge(array_map('trim', Input::all()));
Теперь сделайте остальную часть своего кодирования
$username = Input::get('username'); // it's trimed // ... Validator::make(...);
Если вы хотите исключить некоторые входы из обрезки, тогда вы можете использовать следующее, если all()
Input::except('password');
Или вы можете использовать
Input::only(array('username'));
Обновление : поскольку входы Laravel 5.4.*
TrimStrings
из-за нового промежуточного программного обеспечения TrimStrings
. Поэтому нет необходимости беспокоиться об этом, потому что это промежуточное программное обеспечение выполняется по каждому запросу, и оно также обрабатывает входные данные массива.
В зависимости от вашего проекта ниже может быть слишком навязчивым / обобщенным / etc для ваших нужд; настройте по мере необходимости.
password
(и его подтверждение) исключается, поскольку люди могут захотеть использовать пространство в качестве части дальнейшего затенения своих паролей. 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"] ) ) ); } );
Возможно, вы можете использовать функцию 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'))
$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
а не пустые строки.
Лучше всего делать обрезку в модели, а не в контроллерах, потому что тогда вам не нужно дублировать код во всех ваших контроллерах, чтобы снова и снова обрезать одни и те же вещи:
public function setUsernameAttribute($value) { $this->attributes['username'] = trim($value); }
Таким образом, вам никогда не придется забывать обрезать все атрибуты модели в ваших контроллерах. Модель позаботится об этом, и вам больше не придется об этом беспокоиться.
Что касается обрезки всего сразу и отдельно, я думаю, что разница настолько мала, что никто не заметил бы разницы.
Лучше всего сочетать вышеизложенное. Как правило, вам нужно будет фильтровать все входные данные, кроме полей пароля и пароля_подтверждения. Также делать это с одной строкой в фильтре приятно.
// app / filters.php
App::before(function($request) { // Trim all input Input::merge(array_map('trim', Input::except(['password', 'password_confirmation']))); });
улучшение кода Халила Озгура для удаления всех пробелов, <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; }