2013-03-11 8 views
5

私はzf2.1.3とdoctrine2を使っていました。クラスの情報を水和させようとしていましたが、cat_idのような下線付きのフィールドではDoctrineModule\Stdlib\Hydrator\DoctrineObjectは機能しません。Doctrine 2ハイドレーター - 下線付きフィールド

ここでは例:

/* namespace Application\Entity; */ 

class Foo 
{ 
    private $cat_id; 
    private $cat_name; 

    public function getCatId() 
    { 
     return $this->cat_id; 
    } 

    public function setCatName($name) 
    { 
     $this->cat_name = $name; 
     return $this; 
    } 

    public function getCatName() 
    { 
     return $this->cat_nome; 
    } 
} 

class Bar 
{ 
    private $id; 
    private $name; 

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

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

    public function getName() 
    { 
     return $this->nome; 
    } 
} 

/* namespace Application\Controller; */ 

use \DoctrineModule\Stdlib\Hydrator\DoctrineObject; 
public function indexAction() 
{ 
    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo'); 
    $foo = $hydrator->hydrate(array('cat_name' => 'Frank Moraes'), new Foo()); 
    \Zend\Debug\Debug::dump($foo, 'Foo Hydrator'); 

    $hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Bar'); 
    $bar = $hydrator->hydrate(array('name' => 'Frank Moraes'), new Bar()); 
    \Zend\Debug\Debug::dump($inscrit, 'Bar Hydrator'); 
} 

このコードは次のように返します。

Foo Hydrator 
object(Application\Entity\Foo) 
    private 'cat_id' => null 
    private 'cat_name' => null 

Bar Hydrator 
object(Application\Entity\Foo) 
    private 'id' => null 
    private 'name' => 'Frank Moraes' 

だから私の質問は:教義ハイドレーターはそれに下線いるフィールドでは動作しないのはなぜ? どうすればこの作品を作れますか?

ありがとうございました!

編集

無応答との長い時間のために申し訳ありません。私の仕事ではSOにアクセスできない!

$hydrator = new DoctrineObject($this->getEntityManager(), 'Application\Entity\Foo', false); 

私はここに掲載、このfalseパラメータが正常に動作しますたとえば:

は、私は次のことを試してみました。

しかし、フォームにクラスをバインドするときには機能しませんでした。

誰か手掛かりがありますか?この後

+0

に役立ちます。 –

+0

これは、デフォルトのインフレクターがアンダースコアを処理しないためです。あなた自身でそれを微調整するか、https://github.com/doctrine/DoctrineModule/issuesにあるdoctrineモジュールの問題追跡ツールに問題を投稿する必要があります 私は今すぐに私が見る時間がないことを伝えることができますそれは今すぐに。 – Ocramius

+0

私はhttps://github.com/doctrine/DoctrineModule/issues/190に投稿しました – vinigarcia87

答えて

9

数ヶ月は尋ねてきたが、私はちょうど今DoctrineObjectハイドレーターのソースコードをチェックしてきた、と私は、これは何が起こっているかだと思う:デフォルトでは

、あなたがDoctrineObjectハイドレーターを構築しない限り、 byValueフラグがfalseの場合、ヒュメーターはbyValueモードで動作します。つまり、水和しようとしている値からゲッターとセッターのメソッド名を構築しようとしています。その方法は、フィールド名にucfirstを呼び出し、その前にget/setを付けます。

たとえば、あなたはcat_nameなので、明らかに間違ったgetterメソッドgetCat_nameを試します。

あなたはその後、4つの選択肢、持っている:

  • A:camelCaseあなたの変数名
  • B: falseに設定byValue(それは直接変数にアクセスしようとしたように)[もののIをその場合は変数を公開する必要があるかもしれないと思います...私は以前に試していないので、どのように可視性が影響を与えるかは分かりません]
  • C:別の水和Strategyまたは
  • D:getCat_nameのような奇妙なゲッターとセッターの名前を付けてください(これはしないでください)。
+2

これを投稿していただきありがとうございます!私は変数名をcamelCaseに変更することでこれを解決しました。この問題の理由を知ってよかった! – vinigarcia87

+0

問題ありません!喜んでそれが役立ちます。 –

+0

オプション** B **については、プロパティをpublicに設定しないでください。これは、[遅延読み込みを中断する]ためです(http://stackoverflow.com/questions/4090609/how-can-public-fields-break-lazy- loading-in-doctrine-2)。 getterとsetterなしでプロパティにアクセスするには、[magic '__get'と' __set'](http://php.net/manual/en/language.oop5.magic.php) – Wilt

0

クイックと汚れ...

foreach ($form as $key => $value) { 
     while ($pos = strrpos($key,'_')) {         
      $key = substr_replace($key, '', $pos, 1); 
      $capitalized = strtoupper($key[$pos]); 
      $key[$pos] = $capitalized;         
     } 
     $data[$key] = $value; 
    } 
0

あなたはまだ、このトリックを使用することができます。

/** @ORM\Column(name="column_name", type="string") */ 
protected $columnName; 

function get(...); 
function set($columnName){$this->columnName = $columnName} 

希望は、私はDoctrineのユーザーのGoogleグループに、この質問を投稿したい

関連する問題