2014-03-14 152 views
15

前修剪输入现在,我单独修剪每个输入像下面的代码: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')); 

是任何进场做修剪,同时与

Input::all()Input::only('username', 'password', 'email')

这样做的最佳做法是什么?

+0

你可以做这样的:http://forumsarchive.laravel.io/viewtopic.php?id=1909 –

+0

这意味着我需要验证之前做'新User'?现在我在验证后使用'User :: create()'。 –

回答

47

注:,如果你的任何输入是阵列(如“数据[这个解决方案将无法工作] “)。

你可以试试这个,修剪使用这一行代码验证之前:如果你想排除微调一些投入

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中间件修剪。所以,不需要担心,因为这个中间件在每个请求上执行,并且它也处理数组输入。

+0

什么'输入::合并()'确切地做?我在官方文件中找不到它。 http://laravel.com/docs/requests –

+0

它将新输入与旧输入合并。 –

+0

但是在这里,它将用trimed输入替换输入,因为arra_map返回另一个trimed输入数组。 –

2
$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,而不是空字符串。

3

也许你可以使用php的array_map函数来修剪输入数组的内容。

​​

或者,如果你想要一个变量,你可以在以后使用:

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

不错,但我认为最好是分配一个可以在'User :: create()'后面重用的变量。 – matpop

+0

没错,我编辑了我的答案。 – Needpoule

5

根据您的项目,以下可能是太侵入/泛化/等你的需求;根据需要定制。

  • 我正在使用this小递归数组映射函数为了处理输入数组没有错误。
  • 任何名为password(及其确认)的字段都被排除在外,因为人们可能希望将空间用作进一步遮蔽其密码的一部分。
  • 空间在某些类型的文本中有特殊的含义。例如在Markdown中,two or more spaces at the end of a line inserts <br>。虽然你可能不会需要在开始或结束blob。因人而异。

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"] 
       ) 
      ) 
     ); 
    } 
); 
0

的上述的组合是最好的。一般来说,除了password和password_confirmation字段外,您还需要对所有输入进行过滤。在过滤器中使用单行也是很好的。

//应用程序/ filters.php

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

}); 
+0

一旦你有一个阵列来临,这个“单线程”将失败... – chickenchilli

2

这是一个更好的做法,做模型,而不是在控制器修剪,因为你没有在所有的控制器重复码修剪相同一遍又一遍的东西:

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

这样,你永远不必记得在你的控制器中修剪任何模型属性。该模型将照顾它,你不必再担心它。至于一次一个修整一个个体,我认为差异非常小,以至于没有人会注意到这种差异。

+0

你想将这个因素考虑进模型中,但你为什么要给该模型一个控制器的责任?我的意思是,在OP案例中,他的控制者负责清理输入数据。 –

+0

@Alexandre Martini控制器只负责接收请求并返回响应。 – adam

0

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; 
} 
0

只是使用TrimStringsConvertEmptyStringsToNull中间件。

您不需要做任何额外的事情,因为这些中间件是内置于Laravel 5.4中的。

More detail