Symfony2 と Doctrin2のJob
エンティティとエンティティの間のカスケード永続化をテストしています。Category
これが私のCategory
エンティティです:
<?php
namespace Ibw\JobeetBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Ibw\JobeetBundle\Entity\Affiliate;
use Ibw\JobeetBundle\Entity\Job;
use Ibw\JobeetBundle\Utils\Jobeet;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="Ibw\JobeetBundle\Repository\CategoryRepository")
* @ORM\Table(name="categories")
* @ORM\HasLifecycleCallbacks
*/
class Category
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=255, unique=true)
*/
protected $name;
/**
* @ORM\OneToMany(targetEntity="Job", mappedBy="category", cascade={"persist"})
*/
protected $jobs;
/**
* @ORM\ManyToMany(targetEntity="Affiliate", mappedBy="categories")
*/
protected $affiliates;
/**
* @ORM\Column(type="string", length=255, unique=true)
*/
protected $slug;
/**
* Constructor
*/
public function __construct()
{
$this->jobs = new ArrayCollection();
$this->affiliates = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Category
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Add jobs
*
* @param Job $jobs
* @return Category
*/
public function addJob(Job $jobs)
{
$this->jobs[] = $jobs;
return $this;
}
/**
* Remove jobs
*
* @param Job $jobs
*/
public function removeJob(Job $jobs)
{
$this->jobs->removeElement($jobs);
}
/**
* Get jobs
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getJobs()
{
return $this->jobs;
}
/**
* Add affiliates
*
* @param Affiliate $affiliates
* @return Category
*/
public function addAffiliate(Affiliate $affiliates)
{
$this->affiliates[] = $affiliates;
return $this;
}
/**
* Remove affiliates
*
* @param Affiliate $affiliates
*/
public function removeAffiliate(Affiliate $affiliates)
{
$this->affiliates->removeElement($affiliates);
}
/**
* Get affiliates
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getAffiliates()
{
return $this->affiliates;
}
/**
* Set slug
*
* @param string $slug
* @return Category
*/
public function setSlug($slug)
{
$this->slug = $slug;
return $this;
}
/**
* Get slug
*
* @return string
*/
public function getSlug()
{
return $this->slug;
}
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function setSlugValue()
{
$this->setSlug(Jobeet::slugify($this->getName()));
}
}
その中のカスケード持続部分は次のとおりです。
/**
* @ORM\OneToMany(targetEntity="Job", mappedBy="category", cascade={"persist"})
*/
protected $jobs;
今、このテストを使用してテストしようとすると:
public function testAddJobToCategory()
{
$job = new Job();
$job->setType('flexible-time');
$job->setCompany('Sensio Labs');
$job->setLogo('sensio-labs.gif');
$job->setUrl('http://www.sensiolabs.com/');
$job->setPosition('Web Developer');
$job->setLocation('Paris, France');
$job->setDescription('You\'ve already developed websites with symfony and you want to work with Open-Source technologies. You have a minimum of 3 years experience in web development with PHP or Java and you wish to participate to development of Web 2.0 sites using the best frameworks available.');
$job->setHowToApply('Send your resume to fabien.potencier [at] sensio.com');
$job->setIsPublic(true);
$job->setIsActivated(true);
$job->setToken('job');
$job->setEmail('job@example.com');
$job->setExpiresAt(new \DateTime('+30 days'));
$category = $this->em->createQueryBuilder('c')
->select('c')
->from('IbwJobeetBundle:Category', 'c')
->where('c.id = 1')
->getQuery()
->getSingleResult();
$category->addJob($job);
$this->em->persist($category);
$this->em->flush();
$jobFromQuery = $this->em->createQueryBuilder('j')
->select('j')
->from('IbwJobeetBundle:Job', 'j')
->where('j.type = :type')
->setParameter('type', 'flexible-time')
->setMaxResults(1)
->setFirstResult(1)
->getQuery()
->getSingleResult();
$this->assertEquals(1, $jobFromQuery->getCategory()->getId());
}
このテストを実行すると、次のエラーが発生します。
PHP 致命的なエラー: 非オブジェクトでのメンバー関数 getId() の呼び出し
だからその$jobFromQuery->getCategory()->getId()
部分だと思います。getCategory()
設定されていないか何か。