2012-12-27 3 views
2

나는 표준 게터와 세터의 거대한 플라이를 대신하는 마법 게터와 세터 기능에 대해 읽었다. (Link)젠드 프레임 워크 2 - 교리와 주석 형식에 대한 매직 게터와 세터

내가 AnnotationForms을 사용하고 있으며 $_name과 같은 변수에 밑줄을 표시하지 않으므로 Miles의 기능을 변경했습니다. 마법 기능을 업데이트했지만 예를 들어 전화를 걸 때 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 사실 내 마음에 무엇이 들어 왔습니까? 나는 hydrators가 마법 기능을 사용하지 않는다고 생각합니다. 그들은 실제 getter와 setter를 호출 할 수 있어야합니다. Iirc, 그들은 function_exists를 확인한다. – Sam

+0

업데이트 된 코멘트보기, 역시 체크하겠습니다. – Sam

답변

3

제 의견이 맞았습니다. DoctrineModule\Stdlib\Hydrator\DoctrineObject을 확인하면 기본적으로 \Zend\Stdlib\Hydrator\ClassMethods이 사용됩니다.

: 모든 ClassMethods이 line #60

$methods = get_class_methods($object); 

에서 페치 될 것으로 보는 extract() α- 함수에보고 할 수 복용하고 line #63++에서 살펴 보는 것은 당신은 단지 기본 게터 getX, hasX, isX이 유효한 것으로 볼 수있는 것을 볼 수 있습니다

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

궁극적으로 이것은 세터와 게터를 항상 작성해야한다는 것을 의미합니다. 비록 파일 크기가 조금 더 커질지라도. 평범한 IDE의 경우 더 좋으며 파일 크기에도 불구하고 성능이 향상됩니다.

+0

. 내 자신의 세터 구현 변수를 편집 할 때이 오류가 발생합니다 : '심각한 오류 : 보호 된 속성에 액세스 할 수 없습니다'. 거의 모든 예에서 볼 수 있듯이 내 속성이 보호됩니다 ... 내가 뭘 잘못하고 있는지 아이디어가 있습니까? – Ron

+1

물론'\ Zend \ Stdlib \ Hydrator \ ObjectProperty'를 사용하고 있습니다. 당신이 DoctrineEntities를 사용하고 있기 때문에 올바른 Hydrator는'\ DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject'가 될 것입니다. – Sam

+0

감사합니다. 이제 다음과 같은 결과를 얻었습니다 :'Catchable fatal error : DoctrineModule \ Stdlib \ Hydrator에 전달 된 인수 1 \ DoctrineObject :: __ construct()는 566 행의 ... \ vendor \ zendframework \ zendframework \ library \ Zend \ Form \ Factory.php에있는 Doctrine \ Common \ Persistence \ ObjectManager 인터페이스를 구현해야합니다. . \ vendor \ doctrine \ doctrine-module \ src \ DoctrineModule \ Stdlib \ Hydrator \ DoctrineObject.php on line 63'을 입력하십시오. 내 교리 버전은 적어도 v2.1로 설정되어야합니다. – Ron