Я пытаюсь переопределить метод 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}}
Создайте класс 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