LINUX.ORG.RU

История изменений

Исправление 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']);