2011-12-18 8 views
1

私はSymfony2のモデル(エンティティ)永続性の概念について非常に困惑しています。 AFAIK、symfony2にはmodel_instance-> save()のようなものはありません。その代わりに、それはコントローラでドクトリン・エンティティ・マネージャを検索して呼び出され、その後、model_instanceを持続させてmodel_instanceをフラッシュする必要があります。Symfony2でモデルを適切に持続させるには?

  • ブログメッセージ本文から生成される可変タグモデルインスタンスとカテゴリモデルインスタンスを含むブログモデルがある場合。しかし、私はこれらのタグとカテゴリーを保存するためにBlogファクトリをどのように作成できるのかわかりませんが、代わりにこれらの "Tag"インスタンスと "Category"インスタンスを工場から返す必要があります。私はブログを永続させることはできませんし、ブログ内の単一のメソッドのすべてのタグとカテゴリを永続化することはできません。

実際、モデルを永続化するために定期的に呼び出されるスクリプトを作成したい場合、コントローラーを呼び出す必要があるため不可能に思えますが、なぜスクリプトにWebサーバーが必要なのかわかりませんWebサーバーに触れることなくオブジェクトモデルで作業するだけでなく、存在することができます。

上記の問題を解決する方法を本当に感謝します。ありがとうございました!

+0

ウェブサーバーに触れていない場合、どこにデータを保存していますか?あなたは、クライアントが直接インターフェースするための別個のデータベースサーバーを持っていますか? – MrGlass

+0

ありがとうございます。 1)ユニットテストでそれを保存して確認しています(私はいくつかの方法で前後の質問がありますが、理由は問いません) 2)Cronで実行してください。それはWebサービスを経由する必要があると信じる理由。 3)タグ/カテゴリモデルインスタンスを返さずに保存する(Transitive Persistence Cascadeオペレーションで提案された、私はそれを調べています) また、コントローラを作成せずにPHPUnitでデータを保存することはできませんテストのためのアクションは、私のコードが後で失敗する危険性があることを意味します。私は困惑している。 – Log0

+0

ああ、あなたがウェブサーバーに触れたくないというわけではありません。コントローラを使用したくないということです。それはもっと意味がある:) – MrGlass

答えて

3

Doctrine2はDataMapperパターンの実装です。したがって、Doctrine1やPropelのような他のORMによって実装されているActiveRecordとは概念が異なります。

デフォルトでは、リレーションを持つエンティティを作成するときは、メインエンティティを手動で保持する必要があります。あなたのコメントで

http://www.doctrine-project.org/docs/orm/2.1/en/reference/working-with-associations.html#transitive-persistence-cascade-operations

2

あなたがテストを述べた:しかし、あなたは永続性カスケードを活性化この動作を変更することができます。 http://symfony.com/doc/current/cookbook/testing/doctrine.html

symfony2は実際にはライブラリのデカップリングされたバンドルです。 doctrineを使用するデフォルトの方法はコントローラ経由ですが、あなたはdoctrineライブラリを直接ロードすることができます。私はあなた自身が教義バンドルにどのようにアクセスするのかは分かりませんが、上記の記事の例が役立つと確信しています。

また、symfonyのリード開発者でもあるFabien Potencierは、Symfonyが独自に使用できるバンドルの束であることについて、最近話しました。彼はバンドルの大部分をどのように使用するかの基礎をカバーしました。あなたはここにそれを見ることができます:http://symfony.com/video/Paris2011/583

関連する問題