1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
<?php
namespace ICanBoogie\ActiveRecord\Validate\Validator;
use ICanBoogie\ActiveRecord;
use ICanBoogie\ActiveRecord\Validate\Reader\RecordAdapter;
use ICanBoogie\Validate\Context;
use ICanBoogie\Validate\Validator\AbstractValidator;
class Unique extends AbstractValidator
{
const ALIAS = 'unique';
const DEFAULT_MESSAGE = '`{value}` is already used';
const OPTION_COLUMN = 'column';
public function validate($value, Context $context)
{
$column = $context->option(self::OPTION_COLUMN, $context->attribute);
$record = $this->resolve_record($context);
$model = $record->model;
$where = [ $column => $value ];
$primary = $model->primary;
if (!empty($record->$primary))
{
$where['!' . $primary] = $record->$primary;
}
return !$model->where($where)->exists;
}
protected function get_params_mapping()
{
return [ self::OPTION_COLUMN ];
}
protected function resolve_record(Context $context)
{
$reader = $context->reader;
if (!$reader instanceof RecordAdapter)
{
throw new \InvalidArgumentException(sprintf("Expected `context.reader` to be an instance of `%s`.", RecordAdapter::class));
}
return $reader->record;
}
}