2012-10-19 31 views
19

Tôi cố gắng để tạo database với đối tượng người dùng và Person bằng cách thực hiệnSymfony2: spl_object_hash() dự kiến ​​tham số 1 là đối tượng, chuỗi được đưa ra trong học thuyết

kiên trì và tuôn ra.

Trước hết, tôi đang tạo ra các đối tượng Person và tồn tại và tuôn nó:

$person->setFirstname($enquiry->getFirstname()); 
$person->setLastname($enquiry->getLastname()); 
$person->setLastname($enquiry->getLastname()); 
$person->setSex($enquiry->getSex()); 
$person->setEmail($enquiry->getEmail()); 
$person->setAddress1($enquiry->getAddress1()); 
$person->setAddress2($enquiry->getAddress2()); 
$person->setCity($enquiry->getCity()); 
$person->setZipcode($enquiry->getZipcode()); 
$country = $em->getRepository('SciForumVersion2Bundle:Country')->findOneById($enquiry->getCountry()); 
$person->setCountry($country); 

$em->persist($person); 
$em->flush(); 

Và sau đó đối tượng người dùng của tôi:

$user->setEmail($enquiry->getEmail()); 
$user->setPassword($enquiry->getPassword()); 
$user->setPersonId($person->getId()); 
$user->setDegree($enquiry->getDegree()); 
$user->setSex($enquiry->getSex()); 
$user->setOrganization($enquiry->getOrganization()); 
$user->setTelephone($enquiry->getTelephone()); 
$user->setFax($enquiry->getFax()); 
$user->setWorkplace($enquiry->getWorkplace()); 
$user->setJobtype($enquiry->getJobtype()); 
$user->setResearchField($enquiry->getResearchField()); 
$user->setManageConference(0); 
$user->setIp($IP); 
$user->setStatus(0); 
$user->setDateRegistered(time()); 

$em->persist($user); 
$em->flush(); 

Nhưng khi cố gắng tuôn() các tồn tại của đối tượng người dùng, tôi gặp lỗi:

Warning: spl_object_hash() expects parameter 1 to be object, string given in /home/milos/workspace/conference2.0/vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php line 1095 

Và đây là entier LOG:

Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onEarlyKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". 
Populated SecurityContext with an anonymous Token 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onKernelRequest". 
Matched route "SciForumVersion2Bundle_security_register" (parameters: "_controller": "SciForum\Version2Bundle\Controller\SecurityController::registerAction", "_route": "SciForumVersion2Bundle_security_register") 
Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest". 
Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController". 
Notified event "kernel.controller" to listener "JMS\SecurityExtraBundle\Controller\ControllerListener::onCoreController". 
SET NAMES UTF8 ([]) 
SELECT t0.id AS id1, t0.country AS country2, t0.phone_prefix AS phone_prefix3 FROM countries t0 ([]) 
SELECT t0.id AS id1, t0.degree AS degree2 FROM web_user_degree t0 ([]) 
SELECT t0.id AS id1, t0.place AS place2 FROM web_user_workplace t0 ([]) 
SELECT t0.id AS id1, t0.code AS code2, t0.type AS type3 FROM web_user_jobtype t0 ([]) 
SELECT t0.id AS id1, t0.name AS name2 FROM web_user_field t0 ([]) 
SELECT t0.id AS id1, t0.email AS email2, t0.password AS password3, t0.salt AS salt4, t0.sex AS sex5, t0.department AS department6, t0.organization AS organization7, t0.telephone AS telephone8, t0.fax AS fax9, t0.research_keywords AS research_keywords10, t0.manage_conference AS manage_conference11, t0.ip AS ip12, t0.status AS status13, t0.date_registered AS date_registered14, t0.person_id AS person_id15, t0.degree AS degree16, t0.workplace AS workplace17, t0.jobtype AS jobtype18, t0.research_field AS research_field19, t0.person_id AS person_id20 FROM web_user t0 WHERE t0.email = ? (["[email protected]"]) 
SELECT t0.id AS id1, t0.country AS country2, t0.phone_prefix AS phone_prefix3 FROM countries t0 WHERE t0.id = ? (["196"]) 
INSERT INTO person (firstname, middlename, lastname, sex, email, address1, address2, city, state, zipcode, country) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ({"1":"Milos","2":null,"3":"Cuculovic","4":"m","5":"[email protected]","6":"Kandererstrasse 25","7":null,"8":"Basel","9":null,"10":"4057","11":196}) 
Notified event "kernel.exception" to listener "Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException". 
Notified event "kernel.exception" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelException". 
Notified event "kernel.exception" to listener "Symfony\Component\HttpKernel\EventListener\ExceptionListener::onKernelException". 
ErrorException: Warning: spl_object_hash() expects parameter 1 to be object, string given in /home/milos/workspace/conference2.0/vendor/doctrine/lib/Doctrine/ORM/UnitOfWork.php line 1095 (uncaught exception) at /home/milos/workspace/conference2.0/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php line 65 
Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onEarlyKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\RouterListener::onKernelRequest". 
Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest". 
Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RequestDataCollector::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController". 
Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController". 
Notified event "kernel.controller" to listener "JMS\SecurityExtraBundle\Controller\ControllerListener::onCoreController". 

Trả lời

27

tôi cuối cùng đã tìm thấy các vấn đề:

Khi tạo đối tượng người dùng, thay vì thiết lập những lĩnh vực

$user->setDegree(); 
$user->setWorkplace(); 
$user->setJobtype(); 
$user->setResearchField(); 

như các đối tượng (vì mối quan hệ OneToMany), tôi gived đây chỉ một chuỗi, từ biểu mẫu.

Vì vậy, đối với những lĩnh vực, mã sẽ là:

$degree  = $em->getRepository('SciForumVersion2Bundle:Degree')->findOneById($enquiry->getDegree()); 
$workplace = $em->getRepository('SciForumVersion2Bundle:Workplace')->findOneById($enquiry->getWorkplace()); 
$job_type = $em->getRepository('SciForumVersion2Bundle:JobType')->findOneById($enquiry->getJobtype()); 
$research_field = $em->getRepository('SciForumVersion2Bundle:ResearchField')->findOneById($enquiry->getResearchField()); 

Và sau đó:

$user->setPerson($person); 
$user->setWorkplace($workplace);  
$user->setJobtype($job_type); 
$user->setResearchField($research_field); 

Vì vậy: Hãy cẩn thận khi bạn đang nhận được loại này cảnh báo, bạn có thể có để kiểm tra nếu bạn đang phổ biến đối tượng của mình theo đúng cách.

+3

Chỉnh sửa: Để tối ưu hóa, hãy tránh gọi hàm findOneById để thực hiện việc này. Bạn không cần phải thực hiện một truy vấn và nhận được toàn bộ đối tượng ở đây, vì vậy chỉ cần tạo một đối tượng mới và thiết lập ID. –

+11

Thay vì sử dụng '$ em-> getReference()'. – vbence

+0

@vbence bạn có ý gì ở đây? –

Các vấn đề liên quan