Нужно решить проблему получения из фабрики коллекции сущностей, либо самой сущности. Решил нижеуказанным образом.
Это нормально, что
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