Symfony2でFormをつくる

Symfony2にはFormを作るにはとても便利な機能がたくさんあるのですが、便利ゆえに微妙なカスタマイズができなかったり痒いところに手が届かなかったり(届く知識と技術がなかったり)でなかなか歯がゆいものがあるので、ここではベタに書いてゆく方法を紹介します。
ここでは、
– ID
– ホームページタイトル
– URL
– 連絡先のEmail
– 作成日
– 更新日
– 削除フラグ
という項目で作ります。

バンドルを作成

もしバンドルがなかったらバンドルを作成します。

$ php bin/console generate:bundle --namespace=Leaning\TemplateBundle --format=yml

src/LeaningTemplateBundle/*にControllerとResourcesが自動的に作成されます。

ルーティングの設定

まずはフォーム制作にあたって入力ページにあたるパスを設定してみます。

/app_dev.php/formtop 入力画面
/app_dev.php/formdone 完了画面

でよかろうと思います。昨今の確認画面はそれだけでリクエストを送受信するのはコストがかかってしまうのでJSとかで適当に書くという方針です。

エンティティの作成

いろいろな方法があるのですが、

php bin/console doctrine:generate:entity

LeaningTemplateBundle:Sitebookmark

項目 Name Type
ID Id int(11)
サイトID siteId int(11)
サイト名 siteName varchar(512)
URL url varchar(1024)
連絡先のEmail email varchar(128)
作成日 created datetime
更新日 updated datetime
削除フラグ delFlag int(4)

オートインクリメントの頭のカラムはIDカラムとして自動的に作成されるので、コマンド上のダイアログではエラーになりますので、スキップしてください。

$ php bin/console doctrine:generate:entity
....
The Entity shortcut name: LeaningTemplateBundle:Sitebookmark[enter]
Configuration format (yml, xml, php, or annotation) [annotation]:[enter]
....
New field name (press <return> to stop adding fields): siteId
Field type [string]: integer
Is nullable [false]:
Unique [false]:

New field name (press <return> to stop adding fields): siteName
Field type [string]:
Field length [255]: 512
Is nullable [false]:
Unique [false]:

New field name (press <return> to stop adding fields): url
Field type [string]:
Field length [255]: 1024
Is nullable [false]:
Unique [false]:

New field name (press <return> to stop adding fields): email
Field type [string]:
Field length [255]: 128
Is nullable [false]:
Unique [false]: true

New field name (press <return> to stop adding fields): created
Field type [string]: datetime
Is nullable [false]:
Unique [false]:

New field name (press <return> to stop adding fields): updated
Field type [string]: datetime
Is nullable [false]:
Unique [false]:

New field name (press <return> to stop adding fields): delFlag
Field type [string]: integer
Is nullable [false]:
Unique [false]:
....
Everything is OK! Now get to work :).

新しいエンティティと空のリポジトリが作成されます。

app/src/LeaningTemplateBundle/Entity/Sitebookmark.php
app/src/LeaningTemplateBundle/Repository/SitebookmarkRepository.php

中身をみればわかるのですがエンティティーはゲッター/セッターがバーっと書かれている感じです。

スキーマの作成 / 更新をする

作成されたエンティティからテーブルを作成するには以下のコマンドを使います。

php bin/console doctrine:schema:create

複数のエンティティがすでにある場合には、createじゃなくてupdateを使います。更に駄目そうだったら–forceオプションをつけてみてください。(ダンプもできますよ。ダンプのときは書き出した方がいいです。)

php bin/console doctrine:schema:update --force
php bin/console doctrine:schema:update --dump-sql > xxx.sql

Formパーツをつくる

Symfony2はビルダーみたいなやつでテーブルの構造とフォームの同期を行ってくれますが、カスタマイズするとき面倒くさいので私はベタで書きたいところです。

リクエストを受け取る

Symfony2ではスーパーグローバル変数を直接扱いません。$_GETや$_POSTなどのリクエストデータは内部でオブジェクトに変換されます。
またコントローラでリクエストを受け取るには最低限

....
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
....

という風にHttpFoundation\Requestをuseしないと駄目です。またコントローラのメソットではリクエストを受ける引数を設定してください。

....
public function index1Action(Request $request) //ココ
    {
....

あとは、プレーンなPHPで扱っていた変数をコントローラ内で所定のオブジェクトで受け取ればよいです。

<?php
// $_GET['foo']
$request->query->get('foo');

// $_POST['foo']
$request->request->get('foo');

// ルーティングパラメータ / ex) @Route('/{foo}')
$request->attributes->get('foo');

// $_COOKIE['foo']
$request->cookies->get('foo');

// $_FILES['foo']
$request->files->get('foo');

// $_SERVER['SCRIPT_FILENAME']
$request->server->get('SCRIPT_FILENAME');

// $_SERVER['HTTP_USER_AGENT']
$request->headers->get('User-Agent');

// query > attribute  > request の順で検索
$request->get('foo');

http://fivestar.hatenablog.com/entry/2011/12/21/013929
すでにあるテーブルからエンティティを作成する方法


http://nazo.hatenablog.com/entry/2011/09/30/000000

Last update: 2017.01.23 (月)