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') ?

И для чего лучше всего это делать?

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

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

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

 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 (и его подтверждение) исключается, поскольку люди могут захотеть использовать пространство в качестве части дальнейшего затенения своих паролей.
  • В некоторых типах текста пространство имеет особое значение. Например, в Markdown два или более пробела в конце строки вставляют . Хотя вам, вероятно, это не понадобится в начале или в конце блоба. YMMV.

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"> , &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; }