我整晚都在整理这个大脑。每次我尝试从文档查询序列化结果时,都会收到 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 */
}
}
结果呢?始终布尔(假)。
但是,如果我手动构造一个新的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
,{{1 },enabled
,locked
,expired
和roles
。我怀疑我会看到每个字段,如果它有非空数据。
编辑(2):我见过credentials_expired
对DoctrineObjectConstructor
的默认对象构造函数使用serializer
的引用;并采取了这个answer中确定的步骤,希望他们可以解决我的问题。唉,他们没有(看起来答案和问题更多的是反序列化,但任何方式)并且 bool(false)的结果仍然存在。
编辑(3):序列化元数据未被提取的问题似乎是由于auto_detection
和directories
的明确声明的混合造成的,正如我问过的另一个问题所示:JMSSerializerBundle mixing auto detection and explicit directories?