История изменений
Исправление Kilte, (текущая версия) :
А не было мысли прикрутить какую-нибудь библиотеку для валидации, чтобы избавить себя от рутины и просто описывать правила?
Например:
<?php
class Validator
{
private $rules;
public function __construct(array $rules)
{
$this->rules = $rules;
}
public function validate(array $data)
{
// TODO: validate...
}
}
interface HasRules
{
/**
* @return array
*/
public static function getRules();
}
class ModelFactory
{
/**
* @var Validator[]
*/
private $validators = [];
public function forge($model, array $data)
{
if (!class_exists($model)) {
throw new \InvalidArgumentException();
}
if (in_array(HasRules::class, class_implements($model))) {
if (!array_key_exists($model, $this->validators)) {
$this->validators[$model] = new Validator(call_user_func([$model, 'getRules']));
}
$this->validators[$model]->validate($data);
}
return new $model($data);
}
}
class Model implements HasRules
{
public static function getRules()
{
return [
'name' => 'required',
'email' => ['required', 'email'],
];
}
}
(new ModelFactory())->forge(Model::class, ['name' => 'Foo', 'email' => 'foo@bar.baz']);
Исправление Kilte, :
А не было мысли прикрутить какую-нибудь библиотеку для валидации, чтобы избавить себя от рутины и просто описывать правила?
Например:
<?php
class Validator
{
private $rules;
public function __construct(array $rules)
{
$this->rules = $rules;
}
public function validate(array $data)
{
// TODO: validate...
}
}
interface HasRules
{
/**
* @return array
*/
public static function getRules();
}
class ModelFactory
{
/**
* @var Validator[]
*/
private $validators = [];
public function forge($model, array $data)
{
if (!class_exists($model)) {
throw new \InvalidArgumentException();
}
if (in_array(HasRules::class, class_implements($model))) {
if (!array_key_exists($model, $this->validators)) {
$this->validators[$model] = (new Validator(call_user_func([$model, 'getRules'])));
}
$this->validators[$model]->validate($data);
}
return new $model($data);
}
}
class Model implements HasRules
{
public static function getRules()
{
return [
'name' => 'required',
'email' => ['required', 'email'],
];
}
}
(new ModelFactory())->forge(Model::class, ['name' => 'Foo', 'email' => 'foo@bar.baz']);
Исходная версия Kilte, :
А не было мысли прикрутить какую-нибудь библиотеку для валидации что бы избавить себя от рутины и просто описывать правила?
Например:
<?php
class Validator
{
private $rules;
public function __construct(array $rules)
{
$this->rules = $rules;
}
public function validate(array $data)
{
// TODO: validate...
}
}
interface HasRules
{
/**
* @return array
*/
public static function getRules();
}
class ModelFactory
{
/**
* @var Validator[]
*/
private $validators = [];
public function forge($model, array $data)
{
if (!class_exists($model)) {
throw new \InvalidArgumentException();
}
if (in_array(HasRules::class, class_implements($model))) {
if (!array_key_exists($model, $this->validators)) {
$this->validators[$model] = (new Validator(call_user_func([$model, 'getRules'])));
}
$this->validators[$model]->validate($data);
}
return new $model($data);
}
}
class Model implements HasRules
{
public static function getRules()
{
return [
'name' => 'required',
'email' => ['required', 'email'],
];
}
}
(new ModelFactory())->forge(Model::class, ['name' => 'Foo', 'email' => 'foo@bar.baz']);