web-dev-qa-db-ja.com

パス引数をフォームビルダーに渡す

次のD7コードをDrupal 8.に移植する方法を理解しようとしています。

_function x_menu() {
    $menu['x/form/test/%/%'] = [
        'page callback' => 'drupal_get_form',
        'page arguments' => ['x_form_test', 3, 4],
        'type' => MENU_CALLBACK,
        'title' => 'Test Form',
    ];
    return $menu;
}


function x_form_test(&$form, $form_state, $arg1, $arg2) {
    return $form;
}
_

ルーティングとフォームAPIのドキュメントから収集できることから、パスをフォームに接続する新しい方法は、これを_x.routing.yml_に配置することです。

_x.form_test:
    path: 'x/form/{arg1}/{arg2}',
    defaults:
        _form: '\Drupal\x\XFormTest'
        _title: 'Test Form'
_

そして、最終的にXFormTestから派生するフォームクラスFormBaseを作成します。

ただし、public FormInterface::buildForm(array $form, FormStateInterface $form_state)のような継承された関数シグネチャに引数を追加することは明らかに不可能です*。

XFormTest::buildForm()で_$arg1_と_$arg2_を読み取るにはどうすればよいですか。

(ルーティングAPI: https://www.drupal.org/node/209264

*更新:多分、私が正しく行っていないので、それほど不可能ではないかもしれません。

私の関数宣言

_use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;

class XBBCodeHandlerForm extends FormBase {
  public function buildForm(array $form, FormStateInterface &$form_state, $format = XBBCODE_GLOBAL) {
  }
}
_

次の致命的なエラーを生成します。

_PHP Fatal error:  Declaration of Drupal\xbbcode\Form\XBBCodeHandlerForm::buildForm() 
must be compatible with 
Drupal\Core\Form\FormInterface::buildForm(array $form, 
Drupal\Core\Form\FormStateInterface $form_state)
 in /home/arancaytar/software/web/drupal/modules/xbbcode/src/Form/XBBCodeHandlerForm.php
on line 161
_

編集:私は致命的なエラーを誤解しました。これは追加の引数が原因ではなく、値引数$ form_stateを参照引数に変更したためです。 PHPでは、オプションの引数をオーバーライドする関数に追加できるようです。

2

継承された関数シグネチャに引数を追加することは明らかに不可能です

真実ではない-関数シグネチャに追加の引数を追加することは、継承がOOに存在する基本的な理由の1つです。

これを機能させるには、文字列を関数シグネチャに追加するだけです。

public function buildForm(array $form, FormStateInterface $form_state, $arg1, $arg2) {
    // You have $arg1 and $arg2 available
}

parameter upcasting を使用することで、より豪華なことを行って型付きデータを取得できます。そうしないと、argsが文字列として取得されます。

ここに例

1
Clive