Продолжаю изучать DDD.
Реализовал базовый класс для DTO, в котором добавил поддержу геттеров и функцию make (просто для красоты). Геттеры позволят объявлять свойства как protected и при этом не писать функцию getXXX.
Код: Выделить всё
abstract class BaseDto
{
/**
* @return string
*/
public static function className()
{
return get_called_class();
}
/**
* @param $name
*
* @return mixed
*
* @throws UnknownPropertyException
*/
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
} elseif (property_exists($this, $name)) {
return $this->{$name};
}
throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}
/**
* @param array ...$args
* @return BaseDto
*/
public static function make(...$args)
{
$reflection = new \ReflectionClass(self::className());
return $reflection->newInstanceArgs($args);
}
}
Error - для передачи ошибки в виде строки + код ошибки.
InvalidParamErrors - для передачи ошибок в сущностях на базе Error. Дополнительные свойства - data (ошибки разбитые по параметрам) и errors (плоский список ошибок).
ModelErrors — для передачи ошибок в случаях, когда в качестве сущности используется ActiveRecord.
Код: Выделить всё
/**
* @property string $error
* @property mixed $code
*/
class Error extends BaseDto
{
/**
* @var string
*/
protected $error;
/**
* @var mixed
*/
protected $code;
/**
* @param string $error
* @param mixed $code
*/
public function __construct($error, $code = null)
{
$this->error = (string)$error;
$this->code = $code;
}
/**
* @return string
*/
public function __toString()
{
return $this->error;
}
}
/**
* @property array $data
* @property array $errors
*/
class InvalidParamErrors extends Error
{
/**
* Ошибки сгруппированные по параметрам:
* [
* 'param1' => ['Error 1', 'Error 2', …],
* 'param2' => ['Error 1', 'Error 2', …],
* …
* ]
* @var array
*/
protected $data;
/**
* Список ошибок: ['Error 1', 'Error 2', …]
* @var array
*/
protected $errors;
/**
* @param array $errorsData
* @param null $code
*/
public function __construct($errorsData, $code = null)
{
$this->data = $errorsData;
$this->errors = $this->makeErrors();
parent::__construct($this->makeError(), $code);
}
/**
* @return array
*/
protected function makeErrors()
{
$errors = [];
foreach ($this->data as $e) {
$errors = array_merge($errors, $e);
}
return $errors;
}
/**
* @return string
*/
protected function makeError()
{
return implode(PHP_EOL, $this->errors);
}
}
class ModelErrors extends InvalidParamErrors
{
/**
* @param Model $model
* @param null $code
*/
public function __construct(Model $model, $code = null)
{
parent::__construct($model->getErrors(), $code);
}
}