Laravel 4 – устранение неполадок метода сохранения модели

Я пытаюсь переопределить метод save () класса Post, чтобы я мог проверить некоторые из полей, которые будут сохранены в записи:

// User.php <?php class Post extends Eloquent { public function save() { // code before save parent::save(); //code after save } } 

Когда я пытаюсь запустить этот метод в своем модульном тестировании, я получаю следующую ошибку:

 ..{"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}} 

Solutions Collecting From Web of "Laravel 4 – устранение неполадок метода сохранения модели"

Создайте класс Model.php, который вы расширите в других моделях самооценки

приложение / модели / 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); } } 

Затем отрегулируйте модель Post.
Кроме того, вам необходимо определить правила проверки для этой модели.

приложение / модели / Post.php

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

Метод контроллера
Благодаря классу модели Post модель автоматически проверяется при каждом вызове метода save()

 public function store() { $post = new Post(Input::all()); if ($post->save()) { return Redirect::route('posts.index'); } return Redirect::back()->withInput()->withErrors($post->getErrors()); } 

Этот ответ сильно основан на пакете валидации модели Laravel от Jeffrey Way для Laravel 4.
Все кредиты этому человеку!

Как переопределить Model::save() в Laravel 4.1

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

Если вы хотите перезаписать метод save (), он должен быть идентичен методу save () в Model:

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

А также; вы также можете подключить вызов save () с помощью событий модели: http://laravel.com/docs/eloquent#model-events