-
-
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); | |
} | |
} |
How do you use the errors in your controllers update method?
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.
@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.