2013-08-13 16 views
8

Próbuję przesłonić metodę mojej klasie Post save(), aby można było zweryfikować niektóre z dziedzin, które zostaną zapisane w rekordzie:laravel 4 - Kłopoty modelu nadrzędnym Zachowajmy metodę

// User.php 
<?php 

class Post extends Eloquent 
{ 
    public function save() 
    { 
     // code before save 
     parent::save(); 
     //code after save 
    } 
} 

Kiedy spróbuj uruchomić tę metodę w moim testów jednostkowych pojawia się następujący błąd:

..{"error":{"type":"ErrorException","message":"Declaration of Post::save() should be compatible with that of Illuminate\\Database\\Eloquent\\Model::save()","file":"\/var\/www\/laravel\/app\/models\/Post.php","line":4}} 

Odpowiedz

20

Tworzenie klasy model.php która będzie przebiegać w inny własny walidacji modeli

app/models/model.php

class Model extends Eloquent { 

    /** 
    * Error message bag 
    * 
    * @var Illuminate\Support\MessageBag 
    */ 
    protected $errors; 

    /** 
    * Validation rules 
    * 
    * @var Array 
    */ 
    protected static $rules = array(); 

    /** 
    * Validator instance 
    * 
    * @var Illuminate\Validation\Validators 
    */ 
    protected $validator; 

    public function __construct(array $attributes = array(), Validator $validator = null) 
    { 
     parent::__construct($attributes); 

     $this->validator = $validator ?: \App::make('validator'); 
    } 

    /** 
    * Listen for save event 
    */ 
    protected static function boot() 
    { 
     parent::boot(); 

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

    /** 
    * Validates current attributes against rules 
    */ 
    public function validate() 
    { 
     $v = $this->validator->make($this->attributes, static::$rules); 

     if ($v->passes()) 
     { 
      return true; 
     } 

     $this->setErrors($v->messages()); 

     return false; 
    } 

    /** 
    * Set error message bag 
    * 
    * @var Illuminate\Support\MessageBag 
    */ 
    protected function setErrors($errors) 
    { 
     $this->errors = $errors; 
    } 

    /** 
    * Retrieve error message bag 
    */ 
    public function getErrors() 
    { 
     return $this->errors; 
    } 

    /** 
    * Inverse of wasSaved 
    */ 
    public function hasErrors() 
    { 
     return ! empty($this->errors); 
    } 

} 

Następnie dostosuj model wpisu.
Należy również zdefiniować reguły sprawdzania poprawności dla tego modelu.

app/models/post.php

class Post extends Model 
{ 
    // validation rules 
    protected static $rules = [ 
     'name' => 'required' 
    ]; 
} 

metoda kontrolera
Dzięki Modelem klasy, model Post automatycznie sprawdzane na każde wezwanie do save() metoda

public function store() 
{ 
    $post = new Post(Input::all()); 

    if ($post->save()) 
    { 
     return Redirect::route('posts.index'); 
    } 

    return Redirect::back()->withInput()->withErrors($post->getErrors()); 
} 

ten Odpowiedź jest silnie oparta na Jeffrey Way's Laravel Model Validation package dla Laravel 4.
Zalety tego człowieka!

+1

Dzięki - bardzo użyteczne. – Sunil

+0

Dobrze jest kopiować, ponieważ jest to kod ręcznie. Dziękuję za udostępnienie. – akbarbin

8

Jeśli chcesz nadpisać metodę save(), to musi być identyczna z metody save() w obszarze modelu:

<?php 
public function save(array $options = array()) {} 

And; można też zaczepić w save() rozmowy z modelu zdarzeń: http://laravel.com/docs/eloquent#model-events

11

Jak zastąpić Model::save() w laravel 4.1

public function save(array $options = array()) 
{ 
    parent::save($options); 
} 
+0

@IdanGozlan Proszę nie zmieniaj czyjś kodu, dodaj komentarz, jeśli uważasz, że należy go zmienić. – serakfalcon

+0

dodaj * return * before parent :: save ($ options); – Heroselohim