5

私はzf2.1.3とdoctrine2を使用しています。クラスの情報をハイドレイトしようとしてDoctrineModule\Stdlib\Hydrator\DoctrineObjectいて、のように下線が付いているフィールドでは機能しないことに気付きましたcat_id

ここに例があります:

/* 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'

だから私の質問は:DoctrineHydratorが下線付きのフィールドで機能しないのはなぜですか?どうすればこれを機能させることができますか?

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

編集済み

長い間お詫び申し上げます。私の仕事ではSOにアクセスできません!

私は次のことを試しました:

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

ここに投稿した例では、このfalseパラメーターは正常に機能します。

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

誰かが手がかりを持っていますか?

4

3 に答える 3

9

これが尋ねられてから数ヶ月後、私はDoctrineObjectちょうど今ハイドレーターのソースコードをチェックしています、そして私はこれが起こっていることだと思います:

デフォルトでは、フラグをとしてDoctrineObjectハイドレーターを作成しない限り、ハイドレーターはモードで動作します。つまり、ハイドレイトしようとしている値からゲッターとセッターのメソッド名を作成しようとします。その方法は、フィールド名を呼び出して、それにget/setを付加することです。byValuefalsebyValueucfirst

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

4つの選択肢があります。

  • A: camelCase変数名
  • B: falseに設定byValueします(変数に直接アクセスしようとします)[ただし、その場合は変数を公開する必要があると思いますが...可視性がどのように影響するかはわかりませんが、まだわかりません。以前に試しました]
  • C:別の水分補給を使用するStrategy
  • D:奇妙なゲッターとセッターの名前を持っているだけgetCat_nameです(これはしないでください)。
于 2013-10-04T22:26:52.220 に答える
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;
    }
于 2014-03-11T17:34:51.420 に答える
0

あなたはまだこのトリックを使うことができます:

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

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

希望が役立ちます

于 2014-11-08T14:50:02.540 に答える