Doctrine 2モデルでは、プロパティ/フィールドを公開するべきではないことを読んだことを覚えています。では、これらのフィールドをどのように公開しますか?使用したサンドボックスget*()
とset*()
方法。それが最良のアイデアですか?その非常に面倒です。魔法のメソッド__get()
__set()
を使用すると、フィールドを公開するのと同じようになりますか?
あなたの推薦は何ですか?
Doctrine 2モデルでは、プロパティ/フィールドを公開するべきではないことを読んだことを覚えています。では、これらのフィールドをどのように公開しますか?使用したサンドボックスget*()
とset*()
方法。それが最良のアイデアですか?その非常に面倒です。魔法のメソッド__get()
__set()
を使用すると、フィールドを公開するのと同じようになりますか?
あなたの推薦は何ですか?
パブリック プロパティを使用できない理由は次のとおりです: Doctrine 2 でパブリック フィールドはどのように「遅延読み込みを中断する」ことができますか?
/フィールドへのアクセスを__get()
容易にすることができます。__set()
protected
private
簡単な例を次に示します。
public function __get($name)
{
if(property_exists($this, $name)){
return $this->$name;
}
}
もちろん、すべてのプロパティにアクセスできます。すべてのエンティティが拡張されたクラスにそれを配置し、評価できないフィールドを として定義できますprivate
。または、配列を使用して、アクセスできるプロパティを決定することもできます。$this->accessable = array('name', 'age')
すべてのプロパティを保護する方法はたくさんありますが、それらを取得/設定するかなり簡単な方法があります。
個人的には、些細な目的のボイラープレート コードは好きではありません。コードが見苦しく、読みにくくなります。したがって、私は__get
/を強く好み__set
ます。とはいえ、いくつかの欠点があります。
__get
/__set
フィールドが表示されていない場合にのみ呼び出されます。エンティティ クラスのコードでプロパティにアクセスしても、それらは呼び出されず、プロキシはそれ自体をロードする機会がありません。(Doctrine は、パブリック メソッドの 1 つが呼び出されるとすぐにプロキシをロードすることでこれを回避しようとしますが、__construct
やなどの例外があり__wake
、それが意味をなさない場合があります。コンストラクタ。)empty($entity->field)
ません__get
(したがって、使用するとプロキシの動作が壊れます)。一部の情報を公開する必要がある場合は、そのゲッターを定義します。変更可能な場合は、setter を追加します (さらに良いのは、流暢な setter を追加することです!)。
API はこの方法でよりクリーンになり、魔法は使用されません。私は自分のコードで魔法が好きではありません。
ちょうど私の2セント:)
「流暢なセッター」とは、流暢なインターフェイス パターンを実装するものを意味します。
はい、ゲッター メソッドとセッター メソッドは、データにアクセスする方法です。doctrine2 や hibernate を好まない人がいる理由は少し面倒です。ただし、エンティティごとに 1 回だけ実行する必要があり、希望する出力フォーマットを非常に柔軟に生成できます。cli を使用して、これを行うことができます。しかし、あなたがそれらを転がすとき、私はそれが大したことではないと思います. 特に、必要なプロパティに対してのみこれを行うためです。
乾杯
ゲッターとセッターを別々にしたり、魔法の関数を使用したりするのではなく..クラスにこのようなものがあることに問題はありますか
public function Set($attrib, $value)
{
$this->$attrib = $value;
}
public function Get($attrib)
{
return $this->$attrib;
}
属性へのアクセスが非常に簡単になり、キーペア配列から動的に設定されることを意味します..何かコメントはありますか? または代替提案?
Doctine 2 は、基本的なエンティティ クラスを生成するための [コマンド ライン ツール][1] を提供します。
以下を使用して、マッピングから基本的な Entity クラス定義を取得し、各プロパティのゲッター/セッター関数を完成させます。
path/to/doctrine_cli orm:generate-entities --generate-methods=true path/to/entities/
Entity 用に生成された getter/setter メソッドは型のキャスト/変換を行わないため、適切なデータ型であることを確認するために、各 getter/setter を変更する必要があります。