Задать вопрос
ragnar_ok
@ragnar_ok

Как получить из фабрики коллекцию сущностей либо саму сущность?

Нужно решить проблему получения из фабрики коллекции сущностей, либо самой сущности. Решил нижеуказанным образом.

Это нормально, что AbstactEntityFactory::get возвращает Collection|EntityInterface? В следствие этого не имеет type hint. Предложите лучшее решение проблемы.

Возможно я двигаюсь не в том направлении?

PHP 7.1.

interface EntityFactoryInterface
{
    /**
     * @param mixed[] $state
     */
    public function create(array $state): EntityInterface;
}
 
abstract class AbstactEntityFactory
{
    /**
     * Отстуствует TYPE HINT. Вместо него phpdoc.
     * @param mixed[] $state
     *
     * @return Collection|EntityInterface
     */
    public function get(array $state)
    {
        return $this->create($state);
    }
 
    /**
     * @param mixed[] $state
     */
    protected function createCollection(array $state): Collection
    {
        $collection = new Collection();
 
        foreach ($state as $value) {
            $collection->push($this->create($value));
        }
 
        return $collection;
    }
}
 
class FooFactory extends AbstactEntityFactory
{
    /**
     * {@inheritdoc}
     */
    public function create(array $state): EntityInterface
    {
        return Foo::fromState($state);
    }
 
    /**
     * {@inheritdoc}
     */
    public function get(array $state): Collection
    {
        return $this->createCollection($state);
    }
}
 
class BarFactory extends AbstactEntityFactory
{
    /**
     * {@inheritdoc}
     */
    public function create(array $state): EntityInterface
    {
        return Bar::fromState($state);
    }
}

$fooFactory = new FooFactory();
$foo = $factory->get($state); // Collection|EntityInterface[]
$barFactory = new BarFactory();
$bar = $factory->get($state); // EntityInterface
  • Вопрос задан
  • 140 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
1. ты путаешь/миксуешь фабрику и билдер
2. должен быть определен абстрактный метод AbstactEntityFactory::create()
3. что мешает реализовать Collection::__construct(array $entities)?
4. фабричный метод EntityInterface::fromState() заявлен непосредственно в модели зачем создавать отдельный класс?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы