-
-
Save JonoB/6637861 to your computer and use it in GitHub Desktop.
<?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); | |
} | |
} |
Worth noting this will not work if you use the array syntax for defining your validation rules.
How do we use this?
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);
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.
How do you use the errors in your controllers update method?