Symfony4 Twigテンプレートにレンダリング

コントローラからテンプレートへ

renderメソッドを使用してtemplates/hello/index.html.twigにレンダリングする。

$this => render(テンプレート名, [テンプレートに渡す値の配列]);

ex)

public function index(Request $request)
{
   return $this->render('hello/index.html.twig',[
                  'name' => 'Kii',
                  'age' => 26
          ]);
}

テンプレート側では {{name}}{{age}}と記述することで値が表示される。
簡単!ちなみにTwigの読みはツイッグらしい

テンプレートからコントローラへ(パスパラメータ)

ルートアノテーションにパスパラメータ設定

/**
* @Route("/sample/{msg}", name="sample")
*/

/sample/hogehogeでアクセスすれば、$msg = 'hogehoge'みたいに値を受け取れる。

フォームに入力した値をコントローラで受け取る

テンプレートのフォームインプットname属性で指定した名前で取り出せる。

テンプレート側

<input type="text" name="hoge" />

コントローラ側で取り出す際

$hoge = $reqest->request->get('hoge');

リクエストのHTTPメソッドをチェックする

if ($request->getMethod() == 'POST') {
   // POSTの時の処理
} else {
  // GETの時の処理
}

フォームのデータをインスタンスとして扱う

FormBuilderの作成

$this->createFormBuilder();

フィールドの追加

<<FormBuilder>> -> add( フィールドの名前, フィールドの種類, [属性の連想配列]);

addメソッドはチェーンして呼び出せるので、必要なだけ追加する。
フィールドの種類は、いろいろある。
例えば通常のテキストフィールド<input type="text />をフォームに入れたい場合は
下記のように記述する。(第3引数は省略化)

<<FormBuider>>->add('hoge', TextType::class)

フィールドの種類一覧が見れる
Form Types Reference (Symfony Docs)

一通りフィールドをaddし終わったら、Formを取得する。 FormInterfaceオブジェクトを返す

<<FormBuilder>> ->getForm();

ビューを作る

<<FormInterface>> ->createView();

サンプル

<?php
class Person () {
  protected $name;
  protected $age;
  
  public function setName($name) {
    $this->name = $name;
    return $this; // ここで自身を返すことでメソッドチェーン出来る
  }

  // ゲッター&セッター省略
}

class SampleController extends AbstractController {
  $person = new Person();
  $person->setName('kii')
    ->setAge(25);

  $form = $this->createFormBuilder($person)
    ->add('name', TextType::class)
    ->add('age', IntegerType::class)
    ->add('save', SubmitType::class)
    ->getForm();

  $form->handleRequest($req); //送信されたフォーム情報をハンドリング
  $reqPerson = $form->getData(); // フォームのPersonインスタンスを取得
  $reqName = $reqPerson->getName();
  $reqAge = $reqPerson->getAge();
  ...
}
?>

ひとこと

FormBuilderを利用してTwigテンプレートとレンダリングするフォームが作れるということが分かりました!