看来我整晚都在为此绞尽脑汁。每次我尝试序列化文档查询的结果时,都会收到bool(false)的结果。大概这意味着序列化失败(太好了!也许你愿意告诉我你为什么失败?不?不这么认为。)
我已经告诉了JMSSerializerBundle
我的FOSUserBundle
映射保存在哪里,例如:
jms_serializer:
metadata:
file_cache:
dir: "%kernel.cache_dir%/serializer"
auto_detection: true
directories:
FOSUserBundle:
namespace_prefix: "FOS\\UserBundle"
path: "%kernel.root_dir%/config/serializer/fosuser"
我定义了一个非常简单的 XML 序列化元数据文件,例如Model.User.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<serializer>
<class name="FOS\UserBundle\Model\User" xml-root-name="user" exclusion-policy="all">
<property name="username" type="string" expose="true" />
</class>
</serializer>
而且,在测试控制器中,我在尝试做任何更复杂的事情之前手动调用序列化程序,例如:
class DefaultController extends Controller
{
public function serializeAction()
{
$userManager = // get the user manager
$users = $userManager->findUsers();
$serializer = $this->get('jms_serializer');
foreach ($users as $id => $user) {
Debug::dump('Processing user: '.$user->getUsername());
$result = $serializer->serialize($user, 'json');
Debug::dump($result);
}
/*return a response */
}
}
结果?总是bool(false)。
但是,如果我手动构造一个新User
对象,则序列化工作正常,例如:
class DefaultController extends Controller
{
public function serializeAction()
{
$userManager = // get the user manager
$users = $userManager->findUsers();
$serializer = $this->get('jms_serializer');
$user = new User();
$user->setUsername('testusername');
Debug::dump('Processing user: '.$user->getUsername());
$result = $serializer->serialize($user, 'json');
Debug::dump($result);
/*return a response */
}
}
有什么想法吗?我已经准备好为此失去理智了。
编辑:同样经过进一步思考,值得注意的是,我的序列化元数据看起来并没有得到尊重。如上所示,我只公开了用户名,但是当我在控制器中创建一个新用户名并对其进行序列化时,User
我看到的不仅仅是公开的用户名,我看到的是username
:、、、、、和enabled
locked
expired
roles
credentials_expired
。我怀疑我会看到每个字段,如果它有非空数据。
编辑(2):我已经看到对使用DoctrineObjectConstructor
默认对象构造函数的引用serializer
;并采取了此答案中确定的步骤,希望他们可以解决我的问题。唉,他们没有(看起来那个答案和问题更适合反序列化)并且bool(false)的结果仍然存在。
编辑(3):序列化元数据没有被提取的问题,似乎是由于混合auto_detection
和显式声明directories
,如我问过的另一个问题所示:JMSSerializerBundle 混合自动检测和显式目录?