2017-07-19 3 views
0

集計ハイドレーターをネストすることは可能ですか?zf2 - ネスト化集計ハイドレーター

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

:UserHydratorFactoryは次のように見ていると

class AppointmentModelHydratorFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) { 
     $serviceManager = $serviceLocator->getServiceLocator(); 
     $arrayHydrator = new ArraySerializable(); 
     $arrayHydrator->addStrategy('date', new DateTimeStrategy()) 
      ->addStrategy('endTime', new TimeStrategy()) 
      ->addStrategy('startTime', new TimeStrategy()); 

     $aggregateHydrator = new AggregateHydrator(); 
     $aggregateHydrator->add($arrayHydrator); 
     $aggregateHydrator->add($serviceLocator->get('Hydrator\User')); 
     return $aggregateHydrator; 
    } 
} 

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

class User{ 
    public Location; //* @var Location*/ 
} 

が...(ファクトリから作成)以下AggregateHydratorが移入されている:私は、以下のクラスを持っている場合}

モデルがnullとして返されているので、これはexpectionを投げていますが、私はユーザーハイドレーターにLocationハイドレーターを追加してコメントアウトすると、(ロケーションデータがロードされていなくても)うまく機能します。だから、集約したハイドレーターがネストできるかどうか疑問に思っていましたか?

答えて

0

組み込みではありませんが、実行可能です。

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); 
関連する問題