Zend framework2 zf2-嵌套骨料水合器

Zend framework2 zf2-嵌套骨料水合器,zend-framework2,zend-hydrator,Zend Framework2,Zend Hydrator,是否可以嵌套骨料水合器?如果我有以下课程: class Appointment{ public date; public startTime; public endTime; public User; //* @var User */ } class User{ public Location; //* @var Location*/ } …正在使用以下AggregateHydrator(从工厂创建)填充: 工厂的外观如下所示: class User

是否可以嵌套骨料水合器?如果我有以下课程:

class Appointment{
    public date;
    public startTime;
    public endTime;
    public User; //* @var User */
}

class User{
    public Location; //* @var Location*/ 
}
…正在使用以下AggregateHydrator(从工厂创建)填充:

工厂的外观如下所示:

class UserHydratorFactory implements FactoryInterface
{
     public function createService(ServiceLocatorInterface $serviceLocator) {
        $sm = $serviceLocator->getServiceLocator();
        $userHydrator = new UserHydrator($sm->get('User\Mapper'));
        $aggregateHydrator = new AggregateHydrator();
        $aggregateHydrator->add($userHydrator );
        $aggregateHydrator->add($sm->get('HydratorManager')->get('Hydrator\User\Location'));
        return $aggregateHydrator;
}
}


当模型返回为null时,这会抛出一个期望值,但是如果我注释掉将位置hydrator添加到用户hydrator中,它工作得很好(尽管没有加载位置数据)。所以我想知道骨料水合剂是否可以嵌套?

它不是内置的,但可行

namespace Hydrator;
use Zend\Stdlib\Hydrator\HydratorInterface;
class NestedHydrator implements HydratorInterface
{
    protected $inner_hydrator;
    private $empty;


    public function __construct ($inner_hydrator, $empty)
    {
        $this->inner_hydrator = $inner_hydrator;
        $this->empty = $empty;
    }


    public function extract ($object)
    {
        return [
            $this->getPath() => $this->inner_hydrator->extract ($object->{$this->getPath()})
        ];
    }


    public function hydrate (array $data, $object)
    {
        $object->{$this->getPath()} = $this->inner_hydrator->hydrate ($data [$this->getPath()], $this->empty);

        return $object;
    }


    protected function getPath ()
    {
        return get_class ($this->empty);
    }
}
然后:

$u = new User();
$u->Location = "4 Clinton Rd.";

$a = new Appointment();
$a->date = "yesterday";
$a->startTime = "7:00";
$a->endTime = "8:00";
$a->User = $u;

$h = new AggregateHydrator();
$h->add (new ObjectProperty());
$nested = new \Hydrator\NestedHydrator(new ObjectProperty(), new User());
$h->add ($nested);
$data = $h->extract ($a);

$b = $h->hydrate ($data, new Appointment());
$this->assertEquals ($a, $b);
$u = new User();
$u->Location = "4 Clinton Rd.";

$a = new Appointment();
$a->date = "yesterday";
$a->startTime = "7:00";
$a->endTime = "8:00";
$a->User = $u;

$h = new AggregateHydrator();
$h->add (new ObjectProperty());
$nested = new \Hydrator\NestedHydrator(new ObjectProperty(), new User());
$h->add ($nested);
$data = $h->extract ($a);

$b = $h->hydrate ($data, new Appointment());
$this->assertEquals ($a, $b);