首页 > 解决方案 > EntityManager persist 期望参数 1 是一个实体对象,NULL 给定 zend 教义

问题描述

我有这个 addaction 控制器,尽管正在添加用户,但我收到了这个异常错误。

  public function addAction() {
    $requestObj = $this->getRequest();
    $viewModelObj = new ViewModel();
    $errorMsg = array();
    $userObj = new Entity\User();
    try {
        $userRepo = $this->getDoctrineRepository('User');
        if ($this->getRequest()->getQuery('id')) {
            $userObj = $userRepo->findOneBy(array('id'=>$this->getRequest()->getQuery('id')));
        }
        
        if ($requestObj->isPost()) {
            
            $postData = $requestObj->getPost()->getArrayCopy();
            $currentUser = $this->getFromSession('user');
            
            $error = false;
            
            if (trim($requestObj->getPost('firstName')) == "") {
                $errorMsg[] = "First name is required";
                $error = true;
            }
            
            if ($this->getRequest()->getQuery('id')) {
                if($userObj->getCellPhone() != $postData['cellPhone']) {
                    
                    if($userRepo->findOneBy(array('cellPhone'=> $postData['cellPhone']))) {
                        $errorMsg[] = "Cell Phone is already exists.";
                        $error = true;
                    }
                }
                
            } else {
                
                $existUserByEmailObj = $userRepo->findOneBy(array('email'=> $postData['email']));
                $existUserByCellObj = $userRepo->findOneBy(array('cellPhone'=> $postData['cellPhone']));

                if($existUserByEmailObj){
                    $errorMsg[] = "Email is already exists.";
                    $error = true;
                }

                if($existUserByCellObj){
                    $errorMsg[] = "Cell Phone is already exists.";
                    $error = true;
                }
            }
            
            if ($userObj->getId() && trim($requestObj->getPost('password')) == "") {
                $postData['password'] = $userObj->getPassword();
            } else if (trim($requestObj->getPost('password')) == "") {
                // user add
                $errorMsg[] = "Password is required";
                $error = true;
            }
            
            // in edit if password is empty then insert previous password 
            // populate object with form data
            $hydratorObj = new Hydrator\ClassMethods();
            $hydratorObj->hydrate($postData, $userObj);
            if($error == false) {
                $userObj->setUpdatedBy($currentUser->getId());
                $eMObj = $this->getDoctrineEntityManager();
                if ($userObj->getId()) {
                    //$userObj->setIsVerified(2);
                    $eMObj->merge($userObj);
                    
                } else {
                    $userObj->setCreatedDate(new \DateTime("now"));
                    $userObj->setCreatedBy($currentUser->getId());
                    //$userObj->setIsVerified(2);
                    $eMObj->persist($userObj);
                }
                $eMObj->flush();
                
                // Set User Sms Number
                
                $userSmsNumberRepo = $this->getDoctrineRepository('UserSmsNumber');
                $userSmsNumberObj = $userSmsNumberRepo->findOneBy(array('user'=> $userObj->getId()));
                if(!$userSmsNumberObj) {
                    $smsNumberRepo = $this->getDoctrineRepository('SmsNumber');
                    $smsNumberObj = $smsNumberRepo->findSmsNumber();
                    if ($smsNumberObj) {
                        $userSmsNumberObj = new Entity\UserSmsNumber();
                        $userSmsNumberObj->setUser($userObj);
                        $userSmsNumberObj->setSmsNumber($smsNumberObj);

                        $smsNumberObj->setNoOfAssignee((int)$smsNumberObj->getNoOfAssignee() + 1);
                    }
                    $eMObj->persist($userSmsNumberObj);
                    $eMObj->merge($smsNumberObj);
                    $eMObj->flush();
                    
                    // Send Email Alert to Admin if last one SmsNumber is exists.
                    $lastSmsNumber = $smsNumberRepo->lastOneSmsNumber();
                    if($lastSmsNumber == 0 || $lastSmsNumber == 1) {
                        $settingObj = $this->getDoctrineRepository('Setting');
                        $adminEmail = $settingObj->findValueByFieldName('ADMIN_EMAIL');
                        $sendArr = array($adminEmail => 'Fence-alert');
                        $placeholderArr = array('NAME' => 'Admin', 'SMSNUMBER' => $smsNumberObj->getSmsNumber(), 'NOOFASSIGNEE' => (int)$smsNumberObj->getNoOfAssignee());
                        $sendMailObj = new SendEmail($this->serviceLocator);
                        $sendMailObj->send($sendArr, 'SMSNUMBER_ALERT', $placeholderArr, $toAdmin = TRUE);
                    }
                }
                
                
                $this->flashMessenger()->addMessage('User Saved Successfully!');
                $this->redirect()->toUrl(BASE_URL.'/admin/user');
                
            } 
            
        }  
        $form = new UserForm($this->getServiceLocator(), 'formUser');
        $form->bind($userObj);
        $form->get('password')->setAttribute('type', 'text');
        $form->get('password')->setValue($userObj->getPassword());
        
        $viewModelObj->setVariables(array(
            'errorMsg' => $errorMsg, 
            'form' => $form,
            'userObj' => $userObj
        ));
        return $viewModelObj;
        
    } catch(\Exception $e) {
        print_r($e);

        $this->flashMessenger()->addMessage('Exception Error: User not saved.');
        return $this->redirect()->toUrl(BASE_URL.'/admin/user');
    }
    
}

错误:

Doctrine\ORM\ORMInvalidArgumentException Object ( [message:protected] => EntityManager#persist() expects parameter 1 to be an entity object, NULL given.

..................................................... ..................................................... ..................................................... ..................................................... ..................................................... .....................................

标签: zend-framework2

解决方案


我检查了代码,我认为问题可能是这样的:

  • 在第 82 行检查 $userSmsNumberObj 是否是一个对象。如果为空,则在 if 语句中输入
  • 在第 85 行检查 $smsNumberObj 是对象还是 null
  • 如果 $smsNumberObj 为空,则跳转到第 92 行而不实例化新的 UserSmsNumber,并尝试保持空值

我认为您必须先检查 $userSmsNumberObj 是否是一个对象,然后再尝试在第 92 行保留。


推荐阅读