2016-09-17 5 views
-1

Hallo Ich habe ein Problem beim Ausgeben meiner JSON-Informationen über die Speichermethode im Modell. Ich erhalte den folgenden Fehler - UnexpectedValueException in Response.php Zeile 397: Der Response-Inhalt muss eine Zeichenfolge oder ein Objekt sein, das __toString(), "boolean" implementiert. ich Validierung auf dem Modell, während und in der Validate-Methode des Modells Speicher muß ich die json heraus zu setzen, aber ich bin boolean bekommen statt json ObjektLaravel beim Speichern Modell JSON von Validierung zurück

Javascript:

submit: function(e) { 

    e.preventDefault(); 

    var contact = this.model.save({ 
     firstname: this.firstname.val(), 
     lastname: this.lastname.val(), 
     company: this.company.val(), 
     email_address: this.email_address.val(), 
     description: this.description.val(), 
    }, {success:function(response){ console.log(response)}, wait: true});  

Kontakt Model:

class Contact extends Model 
{ 
    protected $table = "contacts"; 

    protected $fillable = ['firstname', 'lastname', 'company', 'email_address', 'description']; 

    public static function boot() { 
     parent::boot(); 

     static::creating(function($model) { 

      return $model->validate('POST'); 
     }); 

     static::updating(function($model) { 
      return $model->validate('PUT'); 
     }); 

     static::saving(function($model) {    
      return $model->validate('PUT'); 
     }); 
    } 


    public function rules($method) 
    { 


     switch($method) 
     { 
      case 'GET': 
      case 'DELETE': 
      { 
       return []; 
      } 
      case 'POST': 
      { 
       return [ 
        'firstname' => 'required', 
        'lastname' => 'required', 
        'email_address' => 'required|email|unique:contacts,email_address', 
        'description' => 'requried'     
       ]; 
      } 
      case 'PUT': 
      case 'PATCH': 
      { 
       return [ 
        'firstname' => 'required', 
        'lastname' => 'required', 
        'email_address' => 'required|email|unique:contacts,email_address,'.$this->id, 
        'description' => 'required', 
       ]; 
      } 
      default: break; 
     } 

     return []; 
    } 

    public function messages() { 
     return [ 
      'firstname.required' => 'Please enter your first name.', 
      'lastname.required' => 'Please enter your first name.', 
      'email_address.required' => 'Please enter a email address.', 
      'email_address.email' => 'Please enter a valid email address', 
      'email_address.unique' => 'The email is not unique.', 
      'description' => 'Please enter a description.' 
     ]; 
    } 


    public function validate($method) 
    {   
     $data = $this->attributes; 

     // if($data['slug'] === '') { 
     //  // if the slug is blank, create one from title data 
     //  $data['slug'] = str_slug($data['title'], '-'); 
     // } 

     // make a new validator object 
     $v = Validator::make($data, $this->rules($method), $this->messages()); 


     // check for failure 
     if ($v->fails()) 
     {    
      // set errors and return false 
      // json here not return response it's always boolean true or false 
      return new JsonResponse(array('error' => true, 'errors' => $v->messages())); 
     } 

     // validation pass 
     return true; //new JsonResponse(array('errors'=>false)); 

    } 

    public function errors() { 
     return $this->errors; 
    } 

    public function user() { 
     return $this->hasOne('App\User', 'email', 'email_address'); 
    } 
} 

Speichern des Modells:

public function update(Request $request, $id) { 

    $contact = Contact::find($id)->with('user')->first(); 
    $contact->firstname = $request->get('firstname'); 
    $contact->lastname = $request->get('lastname'); 
    $contact->email_address = $request->get('email_address'); 
    $contact->company = $request->get('company'); 
    $contact->description = $request->get('description');  

    return $contact->save(); //return formatted json 
} 
+0

[Save gibt keine formatierte JSON-Zeichenfolge zurück, sondern einen booleschen Wert] (https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_save). – Daedalus

Antwort

2

nach der Implementierung der Validierung, sollten Sie den folgenden teil~~POS=TRUNC ändern (in Contact) n, von der Controller, versuchen, etwas wie folgt aus:

// If validation failed 

if(!$contact->save()) { 
    return response()->json([ 
     'error' => true, 
     'errors' => $contact->errors() 
    ]); 
} 

// Contact created if reached here... 
return response()->json(['error' => false, 'contact' => $contact]); 

Überprüfen Sie auch die Ajax-Request-Validation und Form-Request-Validation (Einfachere und Verwaltbare).


Hinweis: Versuchen Sie nicht, jede Art von HTTP Response von Modell zurückzukehren. Die Rückgabe der HTTP response ist Teil Ihrer Anwendungslogik, und Modell sollte sich nicht um diese kümmern.

0

Wie save() zurück Boolean, so müssen Sie überprüfen, ob es in Ordnung ist.

1) ändern Sie Ihre Contact Modellfehler zu Modell Fehler param zu setzen:

/* if($v->fails()) remove/comment this line 
    ... 
} */ 
$this->errors = $v->errors(); 
return !$v->fails(); 

2) in Ihrem Controller diesem Code setzen:

public function update(Request $request, $id) { 

    $contact = Contact::find($id)->with('user')->first(); 
    if(!$contact) { 
     return response('Contact not found', 404); 
    } 

    $contact->firstname = $request->get('firstname'); 
    $contact->lastname = $request->get('lastname'); 
    $contact->email_address = $request->get('email_address'); 
    $contact->company = $request->get('company'); 
    $contact->description = $request->get('description');  

    return $contact->save()? 
      $contact->toJson() : // returns 200 OK status with contact (json) 
      response($contact->errors, 400); // returns proper 400 Bad Request header with errors (json) in it 
} 

P. S. es ist nett, auf Anforderer mit http-Status zu antworten, hat Industrie alle gemacht, um das Leben des Entwicklers einfach zu machen, also wenn es nicht 2xx ist, 3xx Status so => ​​Antwort für Ihre Anfrage von der clientseitigen App wird behandelt als error (Handler success: function(response) wird

// check for failure 
if ($v->fails()) 
{    
    // set errors and return false 
    // json here not return response it's always boolean true or false 
    return new JsonResponse(array('error' => true, 'errors' => $v->messages())); 
} 

um so etwas wie diese:

if ($v->fails()) {    
    $this->errors = $v->errors(); 
    return false; 
} 

die hier nicht fangen Fehler)

Verwandte Themen