【问题标题】:No valid form to update in symfony - controllersymfony 中没有要更新的有效表单 - 控制器
【发布时间】:2012-11-02 06:01:38
【问题描述】:

首先我在 Symfony2.1 中使用 FOSUserBundle,并将我的角色作为 longtext 存储在用户表中:

a:1:{i:0;s:14:"ROLE_SUPERUSER";}

我能够检索数据并将其发送到 twig bij 中的表单,此代码在控制器中:

public function editUserAction($userId) {
  $User = $this->container->get('fos_user.user_manager')
    ->findUserBy(array('id' => $userId))
  ;

  $selectedRole = $User->getRoles();


  if($selectedRole[0] == 'ROLE_DISTRICTINHABITANT') {
      $selectedRoleNumber = 0;
  } elseif($selectedRole[0] == 'ROLE_DISTRICTWORKER') {
      $selectedRoleNumber = 1;
  } elseif($selectedRole[0] == 'ROLE_CITYWORKER') {
      $selectedRoleNumber = 2;
  } elseif($selectedRole[0] == 'ROLE_ADMIN') {
      $selectedRoleNumber = 3;
  } elseif($selectedRole[0] == 'ROLE_SUPERADMIN') {
      $selectedRoleNumber = 4;
  }      

  $form = $this->createFormBuilder($User)
      ->add('username', 'text')
      ->add('email', 'email')
      ->add('enabled', 'checkbox', array('required' => false))
      ->add('roles', 'choice', array(
          'choices' => array(
              0 => 'DistrictInhabitant',
              1 => 'DistrictWorker',
              2 => 'CityWorker',
              3 => 'Admin',
              4 => 'SuperAdmin',
          ),
          'data' => $selectedRoleNumber
      ))
  ->getForm();

  return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
      'form' => $form->createView(),
      'user' => $User,
  ));
}

但是当我尝试通过另一个函数将此数据保存到数据库时,我没有通过:

if ($form->isValid())

这是我的完整功能,但似乎不起作用:

public function editUserToDatabaseAction($userId) {
    $request = $this->get('request');

    $em = $this->getDoctrine()->getEntityManager();

    $User = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $userId))
    ;

    $form = $this->createFormBuilder($User)
        ->add('username', 'text')
        ->add('email', 'email')
        ->add('enabled', 'checkbox')
        ->add('roles', 'choice', array(
            'choices' => array(
                'DistrictInhabitant' => 'DistrictInhabitant',
                'DistrictWorker' => 'DistrictWorker',
                'CityWorker' => 'CityWorker',
                'Admin' => 'Admin',
                'SuperAdmin' => 'SuperAdmin',
            )
        ))
        ->getForm();

    if ($request->getMethod() == 'POST') {
        $form->bind($this->getRequest());

        if ($form->isValid()) {
            $em->flush();
            return $this->redirect($this->generateUrl('_users'));
        }
    }
}

整个控制器类:

<?php

namespace SocialGeo\BackendBundle\Controller;

use SocialGeo\BackendBundle\Form;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use SocialGeo\UserBundle\Entity\User;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;

class UsersController extends Controller {

 public function indexAction() {
    $Users = $this->container->get('fos_user.user_manager')
        ->findUsers()
    ; 

    if (!$Users) {
        throw $this->createNotFoundException('No users found!');
    }

    return $this->render('SocialGeoBackendBundle:Users:index.html.twig', array('users' => $Users));     
}

 public function changeActiveStateAction($id) {
    $em = $this->getDoctrine()->getManager();

    $selectedUser = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $id));

    $active = $selectedUser->isEnabled();
    if($active) {
        $selectedUser->setEnabled(FALSE);
    } else {
        $selectedUser->setEnabled(TRUE);
    }

    $em->flush();

    return $this->redirect($this->generateUrl('_users'));
 }

 public function editUserAction($userId) {
    $User = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $userId))
    ;


    $selectedRole = $User->getRoles();


    if($selectedRole[0] == 'ROLE_DISTRICTINHABITANT') {
        $selectedRoleNumber = 0;
    } elseif($selectedRole[0] == 'ROLE_DISTRICTWORKER') {
        $selectedRoleNumber = 1;
    } elseif($selectedRole[0] == 'ROLE_CITYWORKER') {
        $selectedRoleNumber = 2;
    } elseif($selectedRole[0] == 'ROLE_ADMIN') {
        $selectedRoleNumber = 3;
    } elseif($selectedRole[0] == 'ROLE_SUPERADMIN') {
        $selectedRoleNumber = 4;
    }


    $form = $this->createFormBuilder($User)
        ->add('username', 'text')
        ->add('email', 'email')
        ->add('enabled', 'checkbox', array('required' => false))
        ->add('roles', 'choice', array(
            'choices' => array(
                0 => 'DistrictInhabitant',
                1 => 'DistrictWorker',
                2 => 'CityWorker',
                3 => 'Admin',
                4 => 'SuperAdmin',
            ),
            'data' => $selectedRoleNumber
        ))
        ->getForm();

    return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
        'form' => $form->createView(),
        'user' => $User,
    ));
 }

 public function editUserToDatabaseAction($userId) {
    $request = $this->get('request');

    $em = $this->getDoctrine()->getEntityManager();

    $User = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $userId))
    ;

    $form = $this->createFormBuilder($User)
        ->add('username', 'text')
        ->add('email', 'email')
        ->add('enabled', 'checkbox')
        ->add('roles', 'choice', array(
            'choices' => array(
                'DistrictInhabitant' => 'DistrictInhabitant',
                'DistrictWorker' => 'DistrictWorker',
                'CityWorker' => 'CityWorker',
                'Admin' => 'Admin',
                'SuperAdmin' => 'SuperAdmin',
            ),
            'empty_value' => false, // user always has at least the default role
            'multiple' => true,
        ))
        ->getForm();

    if ($request->getMethod() == 'POST') {

        $form->bind($this->getRequest());

        if ($form->isValid()) {
            print_r(jej);
            //$data = $form->getData();
            $em->flush();
            return $this->redirect($this->generateUrl('_users'));
        }
    }
 }
}

所以当我尝试更新时,我得到了一个类型为“array”、“string”的 Expected 参数 500 内部服务器错误 - UnexpectedTypeException

当我尝试时:print_r(xxx);我让打印命令在 if ($form->isValid()) 上方的任何地方工作,所以我的表单无效?

另外:我确信 createFormBuilder ->add('roles' ... 会引发错误,因为当我将此添加添加到注释中时,它可以工作,所以...这是数组的错,我该如何解决这个问题控制器?

任何帮助将不胜感激!

【问题讨论】:

  • 失败的原因是什么?
  • 浏览器向我抛出 500 内部服务器错误,因此日志文件中没有错误
  • 我在 Symfony 2.1.3 的一个简单测试中运行了您的表单构建器代码,它并没有对我造成破坏。事实上,如果你的 print_r() 成功到 $form->isValid() 那么大概就是它中断的那一行?我想说这个问题与用户和表单对象之间的映射有关,角色属性似乎是可能的候选者,如果删除它会消除错误。
  • 您仍然缺少操作方法末尾的 return 语句。如果提交的表单包含无效数据,您的应用程序将中断。

标签: forms symfony controller fosuserbundle


【解决方案1】:

编辑以下添加完整的控制器代码到问题:

这里不是尝试诊断特定错误,而是使用角色编辑 FOS 用户的操作示例,涵盖 GET 和 POST(您只需要一个路由/操作,因此您需要更新您的路由)

public function editUserAction($userId) {
    $user = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $userId));

    $form = $this->createFormBuilder($user)
        ->add('username', 'text')
        ->add('email', 'email')
        ->add('enabled', 'checkbox')
        ->add('roles', 'choice', array(
            'choices' => array(
                'DistrictInhabitant' => 'DistrictInhabitant',
                'DistrictWorker' => 'DistrictWorker',
                'CityWorker' => 'CityWorker',
                'Admin' => 'Admin',
                'SuperAdmin' => 'SuperAdmin',
            ),
            'empty_value' => false, // user always has at least one role
            'multiple' => true,
        ))
        ->getForm();

    if ($this->getRequest()->getMethod() == 'POST') {

        $form->bind($this->getRequest());

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getEntityManager();
            $em->flush();
            return $this->redirect($this->generateUrl('_users'));
        }
    }

    return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
            'form' => $form->createView(),
            'user' => $user,
        ));
}

我不能保证这是没有错误的,但希望它足以帮助您实现工作版本。

【讨论】:

  • 另外,在开发过程中,您需要在开发环境中运行 Symfony,因为它提供了在生产环境中对用户隐藏的错误的详细信息。
  • 我没有使用您建议的功能 extractRoles 但我确实使用了您的添加角色方法,我对问题进行了一些编辑。因为这是同一个错误,只是显示了另一个错误......我现在在开发环境中得到的错误是:注意:数组到字符串转换在/Applications/MAMP/htdocs/SocialGeo/vendor/symfony/symfony/src/ Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php 第 457 500 行内部服务器错误 - ErrorException,是的,是否可以只调整我的控制器而不是按照您的第二个代码块建议的那样创建新方法?
  • 好的,我想我知道你为什么会收到这个错误。我会更新我的答案。
  • hmmm 现在我仍然收到错误,即“数组”、“字符串”类型的预期参数给定 500 内部服务器错误 - UnexpectedTypeException 再次更进一步,至少现在它不会尝试转换给定的字符串,但我确实将我所有的角色都添加到了你的“...”中
  • 我也删除了 FOSUserBundle 提供的默认角色。不过,他们都有一个角色。我真的需要替换现有的角色,而不是添加一个。另外我应该在哪里添加这个回报?我已经在我的最后 4 行返回了(检查查询)。已经谢谢了,我删除了一些答案以保持讨论干净。
【解决方案2】:

最后我找到了解决方案。首先,我将树枝中的post 设置为相同的路线(在我的控制器中进行相同的操作)。然后我在请求 post 方法时使用了FOSUserBundle 的设置器,最后一个updateUser 完成了这项工作。

这是我的控制器中单个操作的代码:

public function editUserAction($userId) {
    $request = $this->get('request');

    $User = $this->container->get('fos_user.user_manager')
        ->findUserBy(array('id' => $userId))
    ;

    $selectedRole = $User->getRoles();


    if($selectedRole[0] == 'ROLE_DISTRICTINHABITANT') {
        $selectedRoleNumber = 0;
    } elseif($selectedRole[0] == 'ROLE_DISTRICTWORKER') {
        $selectedRoleNumber = 1;
    } elseif($selectedRole[0] == 'ROLE_CITYWORKER') {
        $selectedRoleNumber = 2;
    } elseif($selectedRole[0] == 'ROLE_ADMIN') {
        $selectedRoleNumber = 3;
    } elseif($selectedRole[0] == 'ROLE_SUPERADMIN') {
        $selectedRoleNumber = 4;
    }


    $form = $this->createFormBuilder($User)
        ->add('username', 'text')
        ->add('email', 'email')
        ->add('enabled', 'checkbox', array('required' => false))
        ->add('roles', 'choice', array(
            'choices' => array(
                0 => 'DistrictInhabitant',
                1 => 'DistrictWorker',
                2 => 'CityWorker',
                3 => 'Admin',
                4 => 'SuperAdmin',
            ),
            'data' => $selectedRoleNumber
        ))
        ->getForm();

    if ($request->isMethod('POST')) {


        $postData = $request->request->get('form');
        $roles_value = $postData['roles'];

        if($roles_value == 0) {
            $FutureRole[0] = "ROLE_DISTRICTINHABITANT";
        } else if($roles_value == 1) {
            $FutureRole[0] = "ROLE_DISTRICTWORKER";
        } else if($roles_value == 2) {
            $FutureRole[0] = "ROLE_CITYWORKER";
        } else if($roles_value == 3) {
            $FutureRole[0] = "ROLE_ADMIN";
        } else if($roles_value == 4) {
            $FutureRole[0] = "ROLE_SUPERADMIN";
        }

        $userManager = $this->container->get('fos_user.user_manager');

        $selectedUser = $userManager->findUserBy(array('id' => $userId));

        $selectedUser->setUsername($postData['username']);
        $selectedUser->setEmail($postData['email']);
        $selectedUser->setEnabled($postData['enabled']);
        $selectedUser->setRoles($FutureRole);

        $userManager->updateUser($selectedUser, true);

        return $this->redirect($this->generateUrl('_users'));

    } else {
        return $this->render('SocialGeoBackendBundle:Users:edit.html.twig', array(
            'form' => $form->createView(),
            'user' => $User,
        ));
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2023-02-11
    • 1970-01-01
    • 2014-02-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多