Zend Framework 2 中的 Hydrator 问题
Hydrator issue in Zend Framework 2
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;
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;