Drupal8 FormクラスでGET通信を使う
カスタムモジュールで、Formクラスを使う時の話。
デフォルトはPOST通信になる。
「設定を変えればGET通信なんて余裕だぜ、はははー」
なんて思いつつ、以下に設定。
<?php $form['#method'] = 'get';
うーん、だめ。動かない。なぜ?
悶々と調べた結果、Drupal8コアのバクとしか思えないんだが…。
以下、コアから引用。
<?php // 'GET' が設定される? $form_state->setRequestMethod($request->getMethod()); // 'GET' 時の分岐 <?php $input = $form_state->isMethodType('get') ? $request->query->all() : $request->request->all();
実際、一つ目のメソッドで 'GET' は設定されない。
以下のように、setRequestMethod ではなく、setMethod を使う必要がある。
<?php $form_state->setMethod($request->getMethod());
ということで、この辺りの処理を、コアから外に出して、手動で行う。
コントローラにて。
<?php $formState = new FormState(); $formState->setMethod('get'); $form = \Drupal::formBuilder()->buildForm('\Drupal\sample_form\Form\ExampleForm', $formState);
上記のように書くと、何事も無かったかのように、FormクラスがGET通信で動く様になる。