Zend Framework 2 中的 Hydrator 问题

Hydrator issue in Zend Framework 2

Pastebin

HERE is my pastebin!


我的 AggregateHydrator:

添加了三个自定义保湿器
$hydrator = new AggregateHydrator();
$hydrator->add(new ClassMethods());
$hydrator->add(new \Application\Hydrator\OrderedUserHydrator());
$hydrator->add(new \Application\Hydrator\ArrivedUserHydrator());
$hydrator->add(new \Application\Hydrator\FittedUserHydrator());

我遇到的问题是 OrderedUserHydrator 似乎只在 ArrivedUserHydrator 有效时有效。实际上,OrderedUserHydrator 应该一直补水。但它不是:

/var/www/zf-skeleton/module/Application/src/Application/Mapper/ZendDbSqlMapper.php:585:
object(Application\Model\Parts)[786]
  protected 'id' => string '16' (length=2)
  protected 'vehicle_id' => string '3' (length=1)
  protected 'status' => string '0' (length=1)
  protected 'part_name' => string 'Test part' (length=9)
  protected 'ordered_from' => string 'A SUPPLIER' (length=10)
  protected 'ordered_user_id' => string '1' (length=1)
  protected 'arrived_user_id' => null
  protected 'fitted_user_id' => string '1' (length=1)
  protected 'ordered_date' => string '2016-04-06 00:00:00' (length=19)
  protected 'arrived_date' => null
  protected 'fitted_date' => string '2016-04-27 15:03:24' (length=19)
  protected 'ordered_user' =>
    object(Application\Model\User)[803]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => null <!-- THIS SHOULD BE SET
      protected 'display_name' => null <!-- THIS SHOULD BE SET
  protected 'arrived_user' =>
    object(Application\Model\User)[804]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => null
      protected 'display_name' => null
  protected 'fitted_user' =>
    object(Application\Model\User)[805]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => string 'alex@home.com' (length=13)
      protected 'display_name' => string 'Alex Foobar' (length=13)

一旦 ArrivedUserHydrator 能够补水,OrderedUserHydrator 就会起作用:

/var/www/zf-skeleton/module/Application/src/Application/Mapper/ZendDbSqlMapper.php:585:
object(Application\Model\Parts)[786]
  protected 'id' => string '16' (length=2)
  protected 'vehicle_id' => string '3' (length=1)
  protected 'status' => string '0' (length=1)
  protected 'part_name' => string 'Test part' (length=9)
  protected 'ordered_from' => string 'A SUPPLIER' (length=10)
  protected 'ordered_user_id' => string '1' (length=1)
  protected 'arrived_user_id' => string '1' (length=1)
  protected 'fitted_user_id' => string '1' (length=1)
  protected 'ordered_date' => string '2016-04-06 00:00:00' (length=19)
  protected 'arrived_date' => string '2016-04-27 15:01:29' (length=19)
  protected 'fitted_date' => string '2016-04-27 15:01:29' (length=19)
  protected 'ordered_user' =>
    object(Application\Model\User)[803]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => string 'alex@home.com' (length=13)
      protected 'display_name' => string 'Alex Foobar' (length=13)
  protected 'arrived_user' =>
    object(Application\Model\User)[804]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => string 'alex@home.com' (length=13)
      protected 'display_name' => string 'Alex Foobar' (length=13)
  protected 'fitted_user' =>
    object(Application\Model\User)[805]
      protected 'user_id' => null
      protected 'username' => null
      protected 'email' => string 'alex@home.com' (length=13)
      protected 'display_name' => string 'Alex Foobar' (length=13)

非常感谢对此事的任何帮助。我一直在撕头发。


我的保湿器如下:

/home/user/development/zf-skeleton/module/Application/src/Application/Hydrator/OrderedUserHydrator.php:

use Zend\Stdlib\Hydrator\ClassMethods;
use Application\Model\User;

class OrderedUserHydrator extends ClassMethods
{
    public function hydrate(array $data, $object)
    {
        $userData = [];

        foreach ($data as $key => $value) {

            $userData[substr($key, 12)] = $value;

            if ('ordereduser_' === substr($key, 0, 12)) {
                $userData[substr($key, 12)] = $value;
            }

        }

        $ordered_user = parent::hydrate($userData, new User());

        $object->setOrderedUser($ordered_user);

        return $object;
    }
}

/home/user/development/zf-skeleton/module/Application/src/Application/Hydrator/ArrivedUserHydrator.php:

use Zend\Stdlib\Hydrator\ClassMethods;
use Application\Model\User;

class ArrivedUserHydrator extends ClassMethods
{
    public function hydrate(array $data, $object)
    {
        $userData = [];

        foreach ($data as $key => $value) {

            $userData[substr($key, 12)] = $value;

            if ('arriveduser_' === substr($key, 0, 12)) {
                $userData[substr($key, 12)] = $value;
            }


        }

        $arrived_user = parent::hydrate($userData, new User());

        $object->setArrivedUser($arrived_user);

        return $object;
    }
}

/home/user/development/zf-skeleton/module/Application/src/Application/Hydrator/FittedUserHydrator.php:

use Zend\Stdlib\Hydrator\ClassMethods;
use Application\Model\User;

class FittedUserHydrator extends ClassMethods
{
    public function hydrate(array $data, $object)
    {
        $userData = [];

        foreach ($data as $key => $value) {

            $userData[substr($key, 11)] = $value;

            if ('fitteduser_' === substr($key, 0, 11)) {
                $userData[substr($key, 11)] = $value;
            }

        }

        $fitted_user = parent::hydrate($userData, new User());

        $object->setFittedUser($fitted_user);

        return $object;
    }
}

你的所有水龙头都有一个错误。从所有水化器中删除这条线,应该可以工作:

$userData[substr($key, 11)] = $value;