Laravel 4:在验证之前修改输入的最佳实践

Che*_*Lin 15 php laravel 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'));
Run Code Online (Sandbox Code Playgroud)

是否有任何方法可以同时修剪Trim

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

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

The*_*pha 48

注意:如果您的任何输入是数组(例如"data []"),则此解决方案将不起作用.

您可以尝试这个,在验证之前使用这一行代码修剪:

Input::merge(array_map('trim', Input::all()));
Run Code Online (Sandbox Code Playgroud)

现在做其余的编码

$username = Input::get('username'); // it's trimed 
// ...
Validator::make(...);
Run Code Online (Sandbox Code Playgroud)

如果您想从修剪中排除某些输入,那么您可以使用以下代替 all()

Input::except('password');
Run Code Online (Sandbox Code Playgroud)

或者你可以使用

Input::only(array('username'));
Run Code Online (Sandbox Code Playgroud)

更新:由于Laravel 5.4.*新的TrimStrings中间件导致输入被修剪.所以,不必担心它,因为这个中间件在每个请求上执行,它也处理数组输入.

  • 使用数组参数时不起作用,如`<input name ="data []">` (2认同)

Hal*_*gür 6

根据您的项目,以下内容可能过于干扰/概括/等等,以满足您的需求; 根据需要定制.

  • 我正在利用这个小的递归数组映射函数来处理输入数组而不会出错.
  • 任何名为password(及其确认)的字段都被排除,因为人们可能希望使用空格作为进一步模糊其密码的一部分.
  • 空间在某些类型的文本中具有特殊含义.例如,在Markdown中,插入一行末尾的两个或多个空格<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;
}
Run Code Online (Sandbox Code Playgroud)

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"]
                )
            )
        );
    }
);
Run Code Online (Sandbox Code Playgroud)