1

私はSymfony2の初心者で、編集フォームと教義の問題に直面しています。

どういうわけか、データベースから破損したオブジェクトを取得しているようです。

このコードは正常に機能します...

$FormDebug = new Link();
$FormDebug->setUrl('http://www.mysite.com');

$editForm = $this->createFormBuilder($FormDebug)
  ->add('url','url')
  ->add('description','text')
  ->getForm();

これはしませんが...

$repository = $this->getDoctrine()->getRepository('HemekonomiLinksBundle:Link');
$user = $this->container->get('security.context')->getToken()->getUser();       

$userLink = $repository->findBy(
    array('id' => $id, 'user' => $user->getId())
);


$editForm = $this->createFormBuilder($userLink)
  ->add('url','url')
  ->add('description','text')
  ->getForm();

だから私はフォームビルダーが同意しないオブジェクトを取得していると思います..?エラーメッセージはありません。フェッチされたオブジェクトの実際の値がフォームに入力されていないだけで、空のフォームが表示されます。

DBから返されたオブジェクトをvar_dump()すると、正しい値がそこにあることがわかります(ユーザーオブジェクトのすべてのプロパティとともに、これが問題の原因ですか?オブジェクトにフォームよりも多くの変数が含まれていますか?)。もちろん、ユーザーがそこにいる理由は、この特定のユーザーに属するDBからそれらのリンク行のみを分類するためです。

更新:ここに2つのvar_dump()を追加しました。最初は、DBから取得すると予想した種類のオブジェクト(オブジェクトを説明するための単なる例)、次に実際に取得されているものです。repository-findアクションが配列を返すことがわかります。オブジェクトの代わりに、しかし私のオブジェクトが含まれているようです...なぜ私は知りません...

私が期待したこと

object(Company\LinksBundle\Entity\Link)#556 (4) { ["id":protected]=> NULL ["user":protected]=> NULL ["description":protected]=> NULL ["url":protected]=> string(25) "http://www.mysite.com" }

DBが返すもの

array(1) { [0]=> object(Company\LinksBundle\Entity\Link)#553 (4) { ["id":protected]=> int(9) ["user":protected]=> object(Company\UserBundle\Entity\User)#145 (19) { ["id":protected]=> int(3) ["username":protected]=> string(5) "user1" ["usernameCanonical":protected]=> string(5) "user1" ["email":protected]=> string(6) "1@1.se" ["emailCanonical":protected]=> string(6) "1@1.se" ["enabled":protected]=> bool(true) ["salt":protected]=> string(31) "oltkauxmgw000w8wgw84ckggg8sw880" ["password":protected]=> string(88) "AFKlCO774d/4D8DHD3P/sXYYApS32jzdLm5GlZEICnOq8xyKT/xVjbnAziMUadecN0yBlxiH5QZK09s5KJxbsA==" ["plainPassword":protected]=> NULL ["lastLogin":protected]=> object(DateTime)#149 (3) { ["date"]=> string(19) "2012-06-27 07:04:24" ["timezone_type"]=> int(3) ["timezone"]=> string(16) "Europe/Stockholm" } ["confirmationToken":protected]=> NULL ["passwordRequestedAt":protected]=> NULL ["groups":protected]=> NULL ["locked":protected]=> bool(false) ["expired":protected]=> bool(false) ["expiresAt":protected]=> NULL ["roles":protected]=> array(0) { } ["credentialsExpired":protected]=> bool(false) ["credentialsExpireAt":protected]=> NULL } ["description":protected]=> string(22) "Beskrivning av länken" ["url":protected]=> string(16) "http://testlink.se" } }

DBが実際のリンクオブジェクトとそれに接続されているユーザーオブジェクトを返すと、ここで何が起こりますか?必要な2つのうちの1つを取り除くのが私の仕事になりますか?

もしそうなら、すでにリポジトリ-> findで、findステートメントのuserフィールドでWHEREを指定しても、ユーザーオブジェクトの選択には興味がなく、Links TABLEにあるものだけが必要であることを指定する方法はありますか?(symfony2の用語でオブジェクトをリンクすると思います...)?

4

2 に答える 2

1
  1. フォームクラスを作成する代わりに、毎回フォームビルダーを使用することは(おそらく)悪い習慣です。
  2. フォームクラスを実行php app/console generate:doctrine:form MyApp:Myentityして使用してみてください(data_classオプションを設定した後-「data_classの設定」のマニュアルを参照してください)
  3. 各オブジェクト(デバッグリンクとデータベースからプルされたリンク)をvar_dumpし、可能であればそれらを投稿します。
于 2012-06-26T18:16:14.523 に答える
0

わかった、

それで、もう少し試行錯誤した後、私の検索方法が問題を引き起こしていることに気づきました。どうやら、findBy(array)も配列を返します。編集用にその単一のオブジェクトを取得するには、find($ id)を実行する必要があります。これにより、ユーザーが自分の「自分の」を編集しようとしている場合にのみ、SELECTの機能が失われます。 " リンク...

とにかく、私がそれを行っていた方法(IDではなくユーザー名を比較することによる)が最善の方法ではない可能性があることがわかりました...

誰かがそれについてコメントを持っているなら、私を正しい方向に向けてください。そうでなければ、私は試行錯誤をして、うまくいかない場合は新しいスレッドを投稿します。

于 2012-06-27T05:44:06.863 に答える