Silex ユーザーガイド

FormServiceProvider

FormServiceProvider はSymfony2 Form コンポーネントを使ったフォーム作成のためのサービスを提供します。

パラメータ

  • form.secret: この秘密の値は特定のページでのCSRFトークンとして生成され、バリデーションされます。この値を静的かつランダムに生成された値にすることはフォームのハイジャック対策として重要です。デフォルトでは md5(__DIR__) になっています。

サービス

登録

use Silex\Provider\FormServiceProvider;

$app->register(new FormServiceProvider());

Note

もし、独自のフォームレイアウトを作成したくないのであれば、デフォルトのものを使用するとよいでしょう。しかしデフォルトレイアウトを使用するためには translation provider の登録が必要です。

フォームのバリデーションが欲しいなら、 Validator provider の登録も行ってください。

Note

Symfony Form Component と、それの全ての依存関係(オプションや必須を含む) はは”fat” Silexに付属し、標準サイズのSilexには付属しません。 もしComposerを使用している場合には、 composer.json ファイルに依存関係を記述してください。

"require": {
    "symfony/form": "~2.3"
}

バリデーションエクステンションも使用したい場合、それらの依存関係として symfony/config`symfony/translation が必要です。

"require": {
    "symfony/validator": "~2.3",
    "symfony/config": "~2.3",
    "symfony/translation": "~2.3"
}

Symfony FormコンポーネントはPHP intl エクステンションに依存しています。 もし持っていなかったら、Symfony Localeコンポーネントをインストールして置換してください。

"require": {
    "symfony/locale": "~2.3"
}

Twigテンプレートでフォームを使用したい場合はSymfony Twig Bridgeをインストールしてください。

"require": {
    "symfony/twig-bridge": "~2.3"
}

使用方法

FormServiceProviderは form.factory サービスを提供します。以下は使用例です。

$app->match('/form', function (Request $request) use ($app) {
    // フォームの初回表示時用のデフォルトデータ
    $data = array(
        'name' => 'Your name',
        'email' => 'Your email',
    );

    $form = $app['form.factory']->createBuilder('form', $data)
        ->add('name')
        ->add('email')
        ->add('gender', 'choice', array(
            'choices' => array(1 => 'male', 2 => 'female'),
            'expanded' => true,
        ))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();

        // データを使った何らかの処理

        // どこかへのリダイレクト
        return $app->redirect('...');
    }

    // フォームの表示
    return $app['twig']->render('index.twig', array('form' => $form->createView()));
});

以下が index.twig フォームテンプレートです。( symfony/twig- bridge が必要です。)

<form action="#" method="post">
    {{ form_widget(form) }}

    <input type="submit" name="submit" />
</form>

もしvalidator providerを使用している場合は、フォームの各フィールドに対して制約を与えることでバリデーションを行なうことができます。

use Symfony\Component\Validator\Constraints as Assert;

$app->register(new Silex\Provider\ValidatorServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'translator.messages' => array(),
));

$form = $app['form.factory']->createBuilder('form')
    ->add('name', 'text', array(
        'constraints' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 5)))
    ))
    ->add('email', 'text', array(
        'constraints' => new Assert\Email()
    ))
    ->add('gender', 'choice', array(
        'choices' => array(1 => 'male', 2 => 'female'),
        'expanded' => true,
        'constraints' => new Assert\Choice(array(1, 2)),
    ))
    ->getForm();

form.types を拡張することでフォームタイプを登録することができます。

$app->extend('form.types', function ($types) use ($app) {
    $types[] = new YourFormType();

    return $types;
});

form.extensions を拡張することでフォームエクステンションを登録することができます。

$app->extend('form.extensions', function ($extensions) use ($app) {
    $extensions[] = new YourTopFormExtension();

    return $extensions;
});

form.type.extensions を拡張することでフォームタイプエクステンションを登録することができます。

$app->extend('form.type.extensions', function ($extensions) use ($app) {
    $extensions[] = new YourFormTypeExtension();

    return $extensions;
});

form.type.guessers を拡張することでフォームタイプ推測器を登録することができます。

$app->extend('form.type.guessers', function ($guessers) use ($app) {
    $guessers[] = new YourFormTypeGuesser();

    return $guessers;
});

トレイト

Silex\Application\FormTrait は以下のショートカットを追加します。

  • form: フォームビルダーインスタンスを生成します。
$app->form($data);

より詳しい情報については、 Symfony2 Forms ドキュメント を参照してください.

commit: d74cb1f9b415356c598de181612eb251246c9408 original: https://github.com/silexphp/Silex/blob/master/doc/providers/form.rst

このページのコンテンツ

前のドキュメント

ValidatorServiceProvider

次のドキュメント

HttpCacheServiceProvider

ソース