Pregunta

For a project with Laravel 4.1 I have a little UI issue I'd like to solve.

Some inputs make an ajax call to laravel on blur and that works fine. It simply sends it's value. In laravel I then check with the validator.

public function validate() {
        if(Request::ajax()) {
            $validation = Validator::make(Input::all(), array(
                'email' => 'unique:users|required|email', 
                'username' => 'required'
            ));
            if($validation->fails()) {
                return $validation->messages()->toJson();
            }
            return "";
        }
        return "";
    }

Although this works, the json string also contains fields I have no need to check. To be precise this is the feedback I get:

{"email":["The email field is required."],"username":["The username field is required."]}

But seeing it is on blur I only want the one I'm actually checking in return. So if i'm blurring email I want a return of:

{"email":["The email field is required."]}

Now I know it's obviously because my array contains multiple fields, but I don't feel like writing a complete validation for each possible input I ever make.

My question is: can I somehow only get a return of the post values that are actually posted, even though the value might be null and not get rest of the array back.

¿Fue útil?

Solución

Try this (untested, feel free to comment/downvote if it doesn't work) :

// Required rules, these will always be present in the validation
$required = ["email" => "unique:users|required|email", "username" => "required"];

// Optional rules, these will only be used if the fields they verify aren't empty
$optional = ["other_field" => "other_rules"];

// Gets input data as an array excluding the CSRF token
// You can use Input::all() if there isn't one
$input = Input::except('_token');

// Iterates over the input values
foreach ($input as $key => $value) {
    // To make field names case-insensitive
    $key = strtolower($key);

    // If the field exists in the rules, to avoid
    // exceptions if an extra field is added
    if (in_array($key, $optional)) {
        // Append corresponding validation rule to the main validation rules
        $required[$key] = $optional[$key];
    }
}

// Finally do your validation using these rules
$validation = Validator::make($input, $required);

Add your required fields to the $required array, the key being the field's name in the POST data, and the optional fields in the $optional array - the optional ones will only be used if the field exists in the submitted data.

Otros consejos

You can also use Laravel requests in a much cleaner way

  public function rules(){

     $validation = [];

     $input = Request::all();

     if (array_key_exists('email', $input)) {
         $validation['email'] = 'unique:users|required|email';
     }
     if (array_key_exists('username', $input)) {
         $validation['username'] = 'required|min:6';
     }

     return  $validation;
  }

I found it. It's going to be something like this:

if(Request::ajax()) {

        $arr = array();
        $arr['email'] = 'unique:users|required|email';
        $arr['username'] = 'required|min:6';

        $checks = array();

        foreach($arr as $key => $value) {
            if(Input::has($key)) {
                $checks[$key] = $value;
            }
        }

        if(count($checks)) {
            $validation = Validator::make(Input::all(), $checks);
            if($validation->fails()) {
                return $validation->messages()->toJson();
            }
        }
        return "ok";
    }
    return "";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top