PUT数据通过fos_rest.request_body ParamConverter - Symfony 3

时间:2016-01-31 21:02:43

标签: php fosuserbundle fosrestbundle symfony

我正在开发一个带有FOS Rest Bundle和FOS用户包的REST API

服务器的 PUT 数据为:

  

{" ID":1,"电子邮件":" email@example.com","用户名":"管理用户""启用":真,"锁定":假,"组"   :[]}

路由看起来没问题:

  

admin_user_put_user输入任何/ admin / users / {id}

它符合以下代码:

/**
 * @ParamConverter("userData", converter="fos_rest.request_body")
 * @View(statusCode=204)
 */
public function putUserAction( $id, User $userData )
{
    $this->denyAccessUnlessGranted( 'ROLE_ADMIN', null, 'Unable to access this page!' );

    $em = $this->getDoctrine()->getManager();
    $user = $em->getRepository( 'AppBundle:User' )->find( $id );
    $user->setEmail( $userData->getEmail() );
    $user->setEmailCanonical( $userData->getEmailCanonical() );
    $user->setEnabled( $userData->isEnabled() );
    $user->setLocked( $userData->isLocked() );
    $em->flush();

}

问题是它没有使用发送的数据填充 $ userData

可能是配置问题吗?

fos_rest:
    disable_csrf_role: ROLE_API
    view:
        view_response_listener: true
        force_redirects:
            html: true
        formats:
            json: true
        templating_formats:
            json: false
            html: true
        mime_types:
            json: ['application/json', 'application/x-json']
        failed_validation: HTTP_BAD_REQUEST
    body_listener: 
        default_format: json
    param_fetcher_listener: 
        force: true
    allowed_methods_listener: true
    access_denied_listener:
        json: true
    body_converter:
        enabled: true
        # validate: true
        # validation_errors_argument: validationErrors # This is the default value
    exception:
        enabled: true
    routing_loader:
        default_format: json
        include_format: false
    format_listener:
        rules:
            -
                # http://symfony.com/doc/current/bundles/FOSRestBundle/format_listener.html
                path: ^/admin/users
                priorities: ['json', 'html', 'xml','form']
                fallback_format: ~
                prefer_extension: true
                methods: [ 'get', 'post', 'put', 'delete']
            - { path: '^/', stop: true }

我理解代码有点尴尬,欢迎提出改进建议。

保存代码中缺少组数据是故意的,我稍后会讨论。

1 个答案:

答案 0 :(得分:2)

检查SensioFrameworkExtraBundle是否存在,以及是否按照here sensio_framework_extra fos_rest )进行配置。

您也可以尝试定义一个类属性,这样它就可以在没有主体转换器的情况下进行映射(看它是否有效):

@ParamConverter("userData", class="AppBundle:User")