2012-12-27 24 views
2

我讀到了一個神奇的getter和setter函數,它取代了標準getter和setter的巨大優勢。 (LinkZend Framework 2 - 神奇的Getter和Setter for Doctrine和Annotation形式

我改變了Miles的功能,因爲我使用的是AnnotationForms,並且不想在$_name這樣的變量中使用下劃線。我更新了魔法功能,但在嘗試撥打例如getName()我得到:

Fatal error: Call to undefined method ... Entity::getName()

這裏是我的代碼:

<?php 
namespace Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Zend\Form\Annotation as Form; 

/** 
* @ORM\Entity 
* @ORM\Table(name="masterdata_entity") 
* @Form\Name("entity") 
* @Form\Attributes({ "class": "form-horizontal" }) 
* @Form\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty") 
*/ 
class Entity 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Form\Exclude() 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(type="string") 
    * @Form\Filter({"name":"StringTrim"}) 
    * @Form\Validator({"name":"StringLength", "options":{"min":1, "max":50}}) 
    * @Form\Attributes({"type":"text"}) 
    * @Form\Options({"label":"Name"}) 
    */ 
    protected $name; 

public function __get($property) { 
    return (isset($this->{$property}) ? $this->{$property} : null); 
} 

public function __set($property, $value) { 
    if (isset($this->{$property})) { 
     $this->{$property} = $value; 
    } 
} 

public function __isset($property) { 
    return isset($this->{$property}); 
} 

} 

任何想法,這是爲什麼,我該如何解決?

+0

請提供您的實體代碼,請 – Sam

+1

這就是我們需要的部分:D實際上,我腦子裏想到的是,我認爲水合物不能用魔法功能工作。他們需要實際的getter和setter來調用。 Iirc,他們檢查function_exists – Sam

+0

查看更新的評論,但我也會檢查它 – Sam

回答

3

我想我的評論是正確的。檢查DoctrineModule\Stdlib\Hydrator\DoctrineObject,你會發現它基本上使用\Zend\Stdlib\Hydrator\ClassMethods。在extract() -function縱觀你可以看到,所有ClassMethods將在line #60

$methods = get_class_methods($object); 

被取出,並在line #63++考慮看看,你會看到只有默認的getter getX, hasX, isX將被視爲有效:

if (!preg_match('/^(get|has|is)[A-Z]\w*/', $method)) { 
    continue; 
} 

這最終意味着,你將永遠不得不編寫你的setter和getters。儘管文件大小可能會變大一點。對於通常的IDE來說更好,即使在文件化的情況下也會提升性能。

+0

謝謝。有我自己的setter實現我編輯變量時出現此錯誤:'致命錯誤:無法訪問受保護的屬性'。我的屬性受到保護,幾乎在每個示例中都顯示出來......任何想法我做錯了什麼? – Ron

+1

當然,您正在使用'\ Zend \ Stdlib \ Hydrator \ ObjectProperty'。由於您使用的是DoctrineEntities,因此使用正確的Hydrator將是'\ DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject' – Sam

+0

謝謝...但現在我得到以下內容:'可捕獲的致命錯誤:參數1傳遞給DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject :: __ construct()必須在第566行中實現接口Doctrine \ Common \ Persistence \ ObjectManager,沒有給出,在...... \ vendor \ zendframework \ zendframework \ library \ Zend \ Form \ Factory.php中調用並在...中定義。 。\ vendor \ doctrine \ doctrine-module \ src \ DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject.php on line 63'。我的教條版本應該設置爲至少v2.1 – Ron