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);