0

私は単純なクラスを持っています:

class Type
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=15)
     */
    private $name;

    ... 
}

データベースにいくつかの「タイプ」オブジェクトがあります。したがって、そのうちの 1 つを変更したい場合は、新しいコントローラー ルール (/types/edit/{id} など) と新しいアクションを作成します。

public function typesEditViewAction($id)
{   
    ... 
    $editedType = new Type();

    $form = $this->createFormBuilder($editedType)
        ->add('name', 'text')
        ->add('id', 'hidden', array('data' => $id))
        ->getForm();

    // send form to twig template
    ...
}

その後、別のコントローラー ルール (/types/do_edit など) とアクションを作成します。

public function typesEditAction(Request $request)
{   
    ... 
    $editedType = new Type();

    $form = $this->createFormBuilder($editedType)
        ->add('name', 'text')
        ->add('id', 'hidden')
        ->getForm();

    $form->bind($request); // <--- ERROR THERE !!!

    // change 'type' object in db
    ...
}

そして、そこで小さな問題を見つけました。クラス 'Type' には自動生成されたセッター setId() がなく、バインド時にエラーが発生しました。

Neither the property "id" nor one of the methods "setId()", "__set()" or "__call()" exist and have public access in class "Lan\CsmBundle\Entity\Type".

ここで、symfony2 フォーム オブジェクト ($form) から 'id' フィールドを削除し、手動でテンプレートに送信します。2 番目のコントローラーのアクションでは、$form オブジェクトと「id」フィールドが離れています。それを行うための「適切な」方法がわかりません(「タイプ」クラスの更新)。助けてください。

4

2 に答える 2

2

Symfony には、データベースからエンティティを自動的にフェッチし、エンティティが見つからない場合に例外 (リスナーでキャッチできます) をスローする、統合されたParamConverterがあります。

GET および POST リクエストを 1 つのコントローラー メソッドで簡単に処理できます。

エンティティにプロパティのパブリック ゲッターとセッターがあることを確認してください。

ルーティングをより明確にするために注釈を追加しましたが、まだ実際の例があります。

use Vendor\YourBundle\Entity\Type;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

// ...

/** 
 *  @Route("/edit/{id}", requirements={"id" = "\d+"})
 *  @Method({"GET", "POST"})
 */
public function editAction(Request $request, Type $type)
{   

    $form = $this->createFormBuilder($type)
        ->add('name', 'text')
        ->add('id', 'hidden')
        ->getForm()
    ;

    if ($request->isMethod('POST')) {
         $form->bind($request);

         if ($form->isValid())
         {
              $em = $this->getDoctrine()->getEntityManager();
              $em->flush();          // entity is already persisted and managed by doctrine.

              // return success response
         }
    }

    // return the form ( will include the errors if validation failed )
}

コントローラーをさらに簡素化するためにフォームタイプを作成することを強くお勧めします。

于 2013-07-18T15:11:59.923 に答える
1

フロントエンドで ID フィールドが必要だったために FormType に ID フィールドを追加した場所でつまずいた人は、次のように ID 列を「マップされていない」に設定できます。

->add('my_field', 'hidden', ['mapped'=>false])

また、ID 値がフォーム処理メソッドによって使用されないようにします。

于 2016-01-11T15:09:38.903 に答える