警告:spl_object_hash()期望参数1为对象,带有Message [英] Warning: spl_object_hash() expects parameter 1 to be object, with Message
问题描述
警告:spl_object_hash()期望参数1为对象
连同此消息
找到的实体的关联类型Subject\Entity\Subject#user,但期望Subject\Entity\User
现在这里是动作我试图实现
public function addAction(){
$ form = new SubjectForm();
$ form-> get('submit') - > setAttribute('label','Add');
$ request = $ this-> getRequest();
if(!$ this-> sessionVar){
$ this-> sessionVar = new SessionContainer('zftutorial');
$ userid = $ this-> sessionVar-> offsetGet('userid');
$ form-> get('user') - > setAttribute('value',$ userid);
}
$ form-> setData($ request-> getPost());
if($ request-> isPost()){
$ subject = new Subject();
$ form-> setInputFilter($ subject-> getInputFilter());
if($ form-> isValid()){
$ subject-> populate($ form-> getData());
$ this-> getEntityManager() - > persist($ subject);
$ this-> getEntityManager() - > flush();
return $ this-> redirect() - > toRoute('subject');
}
}
返回数组('form'=> $ form);
}
这是我的subject.php
命名空间Subject\Entity;
使用Doctrine\ORM\Mapping作为ORM;
使用Zend\InputFilter\InputFilter;
使用Zend\InputFilter\Factory作为InputFactory;
使用Zend\InputFilter\InputFilterAwareInterface;
使用Zend\InputFilter\InputFilterInterface;
/ **
*
* @ ORM\Entity
* @ ORM\Table(name =subject )
* @property string $ subjectname
* @property int $ user_id
* @property int $ id
* /
class Subject implements InputFilterAwareInterface {
protected $ inputFilter;
/ **
* @ ORM\Id
* @ ORM\Column(type =integer);
* @ ORM\GeneratedValue(strategy =AUTO)
* /
protected $ id;
/ **
* @ ORM\Column(type =string)
* /
protected $ subjectname;
/ **
* @ ORM\ManyToOne(targetEntity =Subject\Entity\User,inversedBy =subject)
* @var User | null
* /
private $ user;
/ ** @return User | null * /
public function getUser(){
return $ this-> user;
}
/ ** @param User $ user * /
public function setUser(User $ user){
if($ user === null || $ user instanceof User){
$ this-> user = $ user;
} else {
throw new InvalidArgumentException('$ user must be instance of Entity\User or null!');
}
}
/ **
*魔术吸尘器暴露受保护的属性。
*
* @param string $ property
* @return mixed
* /
public函数__get($ property){
return $ this-> $ property;
}
/ **
* Magic setter保存受保护的属性。
*
* @param string $ property
* @param mixed $ value
* /
public function __set($ property,$ value){
$ this-> $ property = $ value;
}
/ **
*将对象转换为数组。
*
* @return array
* /
public function getArrayCopy(){
return get_object_vars($本);
}
/ **
*从数组中填充。
*
* @param array $ data
* /
public function populate($ data = array()){
$ this-> id = $ data ['id'];
$ this-> subjectname = $ data ['subjectname'];
$ this-> user = $ data ['user_id'];
}
public function setInputFilter(InputFilterInterface $ inputFilter){
throw new \Exception(Not used);
}
public function getInputFilter(){
if(!$ this-> inputFilter){
$ inputFilter = new InputFilter();
$ factory = new InputFactory();
$ inputFilter-> add($ factory-> createInput(array(
'name'=>'id',
'filters'=> array
array('name'=>'Int'),
),
)));
$ inputFilter-> add($ factory-> createInput(array(
'name'=>'subjectname',
'required'=> true,
'filters'=> array(
array('name'=>'StripTags'),
array('name'=>'StringTrim'),
),
'validators'=> array(
array(
'name'=>'StringLength',
'options'=> array(
'encoding'= >'UTF-8',
'min'=> 1,
'max'=> 100,
),
),
)
)));
$ inputFilter-> add($ factory-> createInput(array(
'name'=>'user_id',
'required'=> true,
'filters'=> array(
array('name'=>'Int'),
),
))) ;
$ this-> inputFilter = $ inputFilter;
}
return $ this-> inputFilter;
}
}
我正在尝试实现oneToMany,我不知道这里有什么问题。
确定方案
我正在做的是错的我在做这个
if($ request-> isPost()){
$ subject = new Subject();
$ form-> setInputFilter($ subject-> getInputFilter());
if($ form-> isValid()){
$ subject-> populate($ form-> getData());
$ this-> getEntityManager() - > persist($ subject);
$ this-> getEntityManager() - > flush();
return $ this-> redirect() - > toRoute('subject');
}
}
相反,我不得不首先找到像这样的相关实体
if($ request-> isPost()){
$ subject = new Subject();
//以下是我正在寻找的行
$ user = $ this-> getEntityManager() - > getRepository('Subject\Entity\User') - > ;发现(阵列( 'ID'=> $用户id));
$ form-> setInputFilter($ subject-> getInputFilter());
if($ form-> isValid()){
// $ user-> add
// $ subject-> setUser($ user);
$ subject-> populate($ form-> getData());
$ subject-> setUser($ user);
$ this-> getEntityManager() - > persist($ subject);
$ this-> getEntityManager() - > flush();
return $ this-> redirect() - > toRoute('subject');
}
}
i am getting the error when i try to flush the data,
Warning: spl_object_hash() expects parameter 1 to be object
along with this message
Found entity of type on association Subject\Entity\Subject#user, but expecting Subject\Entity\User
now here is the action i am trying to implement
public function addAction() {
$form = new SubjectForm();
$form->get('submit')->setAttribute('label', 'Add');
$request = $this->getRequest();
if (!$this->sessionVar) {
$this->sessionVar = new SessionContainer('zftutorial');
$userid = $this->sessionVar->offsetGet('userid');
$form->get('user')->setAttribute('value', $userid);
}
$form->setData($request->getPost());
if ($request->isPost()) {
$subject = new Subject();
$form->setInputFilter($subject->getInputFilter());
if ($form->isValid()) {
$subject->populate($form->getData());
$this->getEntityManager()->persist($subject);
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('subject');
}
}
return array('form' => $form);
}
and this is my subject.php
namespace Subject\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
/**
*
* @ORM\Entity
* @ORM\Table(name="subject")
* @property string $subjectname
* @property int $user_id
* @property int $id
*/
class Subject implements InputFilterAwareInterface {
protected $inputFilter;
/**
* @ORM\Id
* @ORM\Column(type="integer");
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $subjectname;
/**
* @ORM\ManyToOne(targetEntity="Subject\Entity\User", inversedBy="subjects")
* @var User|null
*/
private $user;
/** @return User|null */
public function getUser() {
return $this->user;
}
/** @param User $user */
public function setUser(User $user) {
if ($user === null || $user instanceof User) {
$this->user = $user;
} else {
throw new InvalidArgumentException('$user must be instance of Entity\User or null!');
}
}
/**
* Magic getter to expose protected properties.
*
* @param string $property
* @return mixed
*/
public function __get($property) {
return $this->$property;
}
/**
* Magic setter to save protected properties.
*
* @param string $property
* @param mixed $value
*/
public function __set($property, $value) {
$this->$property = $value;
}
/**
* Convert the object to an array.
*
* @return array
*/
public function getArrayCopy() {
return get_object_vars($this);
}
/**
* Populate from an array.
*
* @param array $data
*/
public function populate($data = array()) {
$this->id = $data['id'];
$this->subjectname = $data['subjectname'];
$this->user = $data['user_id'];
}
public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
$inputFilter->add($factory->createInput(array(
'name' => 'id',
'filters' => array(
array('name' => 'Int'),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'subjectname',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'user_id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
)));
$this->inputFilter = $inputFilter;
}
return $this->inputFilter;
}
}
i am trying to implement oneToMany but i dont know what is wrong here.
Ok found answer
what i was doing was wrong i was doing this
if ($request->isPost()) {
$subject = new Subject();
$form->setInputFilter($subject->getInputFilter());
if ($form->isValid()) {
$subject->populate($form->getData());
$this->getEntityManager()->persist($subject);
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('subject');
}
}
Instead i had to first find the Relevant entity like this
if ($request->isPost()) {
$subject = new Subject();
//following is the line i was looking for
$user = $this->getEntityManager()->getRepository('Subject\Entity\User')->find(array('id'=>$userid));
$form->setInputFilter($subject->getInputFilter());
if ($form->isValid()) {
//$user->add
//$subject->setUser($user);
$subject->populate($form->getData());
$subject->setUser($user);
$this->getEntityManager()->persist($subject);
$this->getEntityManager()->flush();
return $this->redirect()->toRoute('subject');
}
}
这篇关于警告:spl_object_hash()期望参数1为对象,带有Message的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!