2011-12-24 34 views
0

我有兩個類:原則2.1 - 調用未定義的方法+ MyMethod(Proxy)?

新聞

/** @Entity @Table(name="news") */ 
class News { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $title; 

    /** 
    * @Column(type="text") 
    * @var string 
    */ 
    protected $content; 

    /** 
    * @ManyToOne(targetEntity="User", inversedBy="news") 
    * @JoinColumn(referencedColumnName="id") 
    */ 
    protected $author; 

    /** 
    * @ManyToOne(targetEntity="NewsCategory", inversedBy="news") 
    * @JoinColumn(referencedColumnName="id") 
    */ 
    protected $category; 

    /** 
    * @Column(type="datetime") 
    */ 
    protected $add_date; 

    # CATEGORY methods 
    public function setCategory($val) { if($val instanceof NewsCategory) $this->category = $val; } 
    public function getCategory() { return $this->category; } 
} 

新聞分類

/** @Entity @Table(name="news_category") */ 
class NewsCategory { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @Column(type="string", length=50, unique=TRUE) 
    * @var string 
    */ 
    protected $name; 

    /** 
    * @OneToMany(targetEntity="News", mappedBy="category") 
    */ 
    protected $news;  

    public function __construct() { 
     $this->news = new \Doctrine\Common\Collections\ArrayCollection; 
    } 

    public function setName($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 

    public function getNews() { return $this->news; } 
} 

我想這個查詢下載一個新聞:

$q = $this->db->createQuery("SELECT n FROM News n WHERE n.id = :id"); 
$q->setParameter('id', $_GET['id']); 
$news = $q->getResult(); 

而接下來,我想獲得與此相關的新聞與

$news->getCategory()->getId() 

有了上面的代碼中,我得到這個錯誤類別的ID:

Fatal error: Call to undefined method DoctrineProxies\NewsCategoryProxy::getId() in C:\[...]\newsController.php on line 61 

有什麼不對?爲什麼我的NewsCategory類看不到getId()方法?

回答

2

這是一個很好的做法,總是宣佈你的類的成員是私人的,併爲你的類成員生成getter和setter。

在你的情況下,你不會產生getter和setter(你的NewCategory類沒有getId()方法)。

那是你NewCategory類應該怎麼樣子:

/** @Entity @Table(name="news_category") */ 
class NewsCategory { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    private $id; 

    /** 
    * @Column(type="string", length=50, unique=TRUE) 
    * @var string 
    */ 
    private $name; 

    /** 
    * @OneToMany(targetEntity="News", mappedBy="category") 
    */ 
    private $news;  

    public function __construct() { 
     $this->news = new \Doctrine\Common\Collections\ArrayCollection; 
    } 

    public function getId(){ return $this->id;} 
    public function setId($id){ $this->id = $id;} 

    public function setName($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 

    public function setNews($news) {$this->news = $news;} 
    public function getNews() { return $this->news; } 

} 

生成的代理不會產生神奇 getter和setter方法在每個你的屬性的(它會打破面向對象的封裝原則)。 您可以在這裏找到更多關於代理的文檔:http://www.doctrine-project.org/docs/orm/2.0/en/reference/configuration.html#proxy-objects

+0

在學說文檔上,他們有''protected'成員。而且,'protected'類型在你的例子中:)。那麼比什麼更好? – 2012-01-23 16:21:44

+0

你是對的,我糾正了我的答案,並將其標記爲私人。正如你在教條文檔的鏈接中看到的,我給了他們在課堂以外不能訪問的屬性。 [Here](http://www.doctrine-project.org/docs/orm/2.1/en/reference/working-with-objects.html#entity-object-graph-traversal),你可以看到他們使用公共getter和制定私人財產。 – BlackCharly 2012-01-23 22:33:05

+0

不要盲目地使用'private'或'protected'而不知道原因。 'private'只能將這些屬性的訪問權限限制在擁有的類中(不包括子類)。 'protected'授予訪問子類的權限。使用'protected'的一個好處是它允許你的[實體被序列化](http://www.doctrine-project.org/docs/orm/2.2/en/reference/working-with-objects.html#merging -entities) – Phil 2012-01-23 23:11:32

相關問題