Skip to content

Instantly share code, notes, and snippets.

@JonoB
Created September 20, 2013 13:49
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save JonoB/6637861 to your computer and use it in GitHub Desktop.
Save JonoB/6637861 to your computer and use it in GitHub Desktop.
Laravel Base Model
<?php namespace Tmb;
use Illuminate\Database\Eloquent\Model as Eloquent;
use Illuminate\Validation\Validator;
class BaseModel extends Eloquent
{
/**
* Error message bag
*
* @var Illuminate\Support\MessageBag
*/
protected $errors;
/**
* Validation rules
*
* @var Array
*/
protected static $rules = array();
/**
* Custom error messages
*
* @var array
*/
protected static $messages = 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()
{
$replace = ($this->getKey() > 0) ? $this->getKey() : '';
foreach (static::$rules as $key => $rule)
{
static::$rules[$key] = str_replace(':id', $replace, $rule);
}
$validator = $this->validator->make($this->attributes, static::$rules, static::$messages);
if ($validator->passes()) return true;
$this->setErrors($validator->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;
}
/**
* Return if there are any errors
*
* @return bool
*/
public function hasErrors()
{
return ! empty($this->errors);
}
}
@jimthedev
Copy link

@JonoB, have you considered submitting this as a pull request to Laravel so that this could be the default functionality for models? Seems like this is much better functionality for validating model updates than the current implementation.

@davidsoderberg
Copy link

How do you use the errors in your controllers update method?

@dwightwatson
Copy link

Worth noting this will not work if you use the array syntax for defining your validation rules.

@yazeed
Copy link

yazeed commented Jun 10, 2014

How do we use this?

@zoul0813
Copy link

This works really well and solved a problem I was having.

I modified the above code to replace '{:id}' instead of ':id', as the ':id' was conflicting with the "required_without:id' rule I had applied on another field. The use of '{}' allows me to quickly identify the ':id' as a "templated" value when scanning rules as well.

Line 65:

    static::$rules[$key] = str_replace('{:id}', $replace, $rule);

@pdcmoreira
Copy link

This breaks on inserts for me because my rule is checked also on inserts and when the model is new and therefore has no id, it passes an empty string as the id to search for.

I've replaced $replace = ($this->getKey() > 0) ? $this->getKey() : ''; with $replace = ($this->getKey() > 0) ? $this->getKey() : 0;. Seems to fix the problem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment