我正在制作灯具,当我尝试加载灯具时出现错误。我需要一个Movie对象的实例,但我给的是,我不知道为什么,是一个整数。出于这个原因,它告诉我,我有以下错误:
[Symfony\Component\Debug\Exception\ContextErrorException]
Catchable Fatal Error: Argument 1 passed to Filmboot\MovieBundle\Document\A
ward::setMovie() must be an instance of Filmboot\MovieBundle\Document\Movie
, integer given, called in C:\Programming\xampp\htdocs\filmboot.web\src\Fil
mboot\MovieBundle\DataFixtures\MongoDB\Awards.php on line 143 and defined i
n C:\Programming\xampp\htdocs\filmboot.web\src\Filmboot\MovieBundle\Documen
t\Award.php line 107
这是我的Fixture类:
namespace Filmboot\MovieBundle\DataFixtures\MongoDB;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Filmboot\MovieBundle\Document\Award;
class Awards extends AbstractFixture implements OrderedFixtureInterface {
public function load(ObjectManager $manager) {
$awards = array(
array(
"name" => "Sitges",
"year" => "1992",
"category" => "Best director"
);
foreach ($awards as $award) {
$document = new Award();
$document->setName ($award["name"]);
$document->setYear ($award["year"]);
$document->setCategory($award["category"]);
$manager->persist($document);
$this->addReference("award-" .$i, $award);
}
$manager->flush();
}
public function getOrder() {
return 1;
}
}
这是文档类:
namespace Filmboot\MovieBundle\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Doctrine\Common\Collections\ArrayCollection;
use Filmboot\MovieBundle\Util;
/**
* @ODM\Document(db="filmbootdb", collection="awards")
* @ODM\Document(repositoryClass="Filmboot\MovieBundle\Document\AwardRepository")
*/
class Award {
/**
* @ODM\Id
*/
private $id;
/**
* @ODM\String
*/
private $name;
/**
* @ODM\Int
*/
private $year;
/**
* @ODM\String
*/
private $category;
/**
* @ODM\ReferenceOne(targetDocument="Movie", mappedBy="awards", cascade={"persist"})
*/
private $movie;
public function getId() {
return $this->id;
}
public function setName($name) {
return $this->name = $name;
}
public function getName() {
return $this->name;
}
public function setYear($year) {
return $this->year = $year;
}
public function getYear() {
return $this->year;
}
public function setCategory($category) {
return $this->category = $category;
}
public function getCategory() {
return $this->category;
}
public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie) {
$movie->setAward($this);
return $this->movie = $movie;
}
}
答案 0 :(得分:2)
我们可以看到你为电影明确地给出了一个整数:
$awards = array(
array(
// ...
"movie" => 1,
),
);
// ...
$document->setMovie ($award["movie"]);
而不是电影对象,因此脚本崩溃,因为它需要一个Movie对象:
public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie) {
return $this->movie = $movie;
}
因此解决方案是创建电影的装置并给它们reference:
// When saving inside Movie fixtures
$manager->persist($movie);
$manager->flush();
$this->addReference('movie-'.$i, $movie); // Give the references as movie-1, movie-2...
然后首先使用getOrder()方法加载它们:
public function getOrder()
{
return 0; // 0, loaded first
}
控制在电影后加载奖励:
public function getOrder()
{
return 1; // loaded after 0...
}
并且在你的奖项夹具之后通过引用检索它们,它将加载整个对象,而不仅仅是一个id(整数):
$awards = array(
array(
// ...
"movie" => $this->getReference('movie-1'), // Get the Movie object, not just id
),
);
// ...
$document->setMovie ($award["movie"]);
请注意,如果您想使用引用和顺序,您的fixture类需要实现OrderedFixtureInterface:
namespace Acme\HelloBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Acme\HelloBundle\Entity\Group;
class LoadGroupData extends AbstractFixture implements OrderedFixtureInterface
你必须与演员,导演......等所有其他实体一起做这件事。
您可以在灯具here之间找到共享对象的文档(通过引用)。
编辑:
使双向工作,适应奖励制定者:
public function setMovie(\Filmboot\MovieBundle\Document\Movie $movie) {
$movie->setAward($this);
return $this->movie = $movie;
}
并使用级联持久性来适应持久性:
/**
* @ODM\ReferenceOne(targetDocument="Movie", mappedBy="awards", cascade={"persist"})
*/
private $movie;
答案 1 :(得分:1)
因为你得到的错误信息足够清楚。以下是修复这个错误的参数映射问题的方法。
而不是将整数设置为movie
到您用于填充awards
实例的document
数组。为什么不设置一个已经存在的给定Movie
实体。
要做到这一点,你必须加载一个或多个movies
(这取决于你的需要)并设置这个/那些权利(y / ies)作为参数来填充你的{{1实例。
一个例子, 看看已经持久化的用户组填充的用户的this example(在问题上)。你可以在这里使用相同的想法。