ホームページ >バックエンド開発 >PHPチュートリアル >Symfony 2の構築と処理フォーム

Symfony 2の構築と処理フォーム

Jennifer Aniston
Jennifer Anistonオリジナル
2025-02-21 09:33:12229ブラウズ

Building and Processing Forms in Symfony 2

このチュートリアルでは、Symfony 2で処理を形成するための2つのアプローチを調査します。最初のものは、ビュー内に直接フォーム要素を埋め込み、コントローラーで手動で処理することを示します。 2番目は、オブジェクト指向のフォーム宣言と自動処理と永続性のためにSymfonyのフォームシステムを利用しています。

イラストには、SymfonyのデフォルトのAcmedemobundleを使用します。 完全なコードは[This Repository](repository_link_here-利用可能な場合は実際のリンクに置き換えます)で利用できます。

重要な概念:

Symfony 2は、フォームの作成と取り扱いのための2つの主要な方法を提供します。コントローラーベースの処理を使用して、ビューに手動HTML埋め込み、およびSymfonyのオブジェクト指向フォームシステム。

非エンティティフォームは、Symfonyビューファイルに標準のHTMLフォーム要素を追加することにより作成されます。これには、Form HTML、ロジック処理のためのコントローラーメソッド(レンダリング、処理)、およびコントローラーメソッドへのURLをマッピングするルートを含むビューファイルが含まれます。
    Symfonyエンティティとフォームは、より効率的なアプローチを提供します。 これには、Symfonyエンティティのフォームの作成、Symfonyフォームビルダーの使用、およびフォームの構築、命名、およびデフォルトオプションの方法の定義が含まれます。 これらのフォームは、コントローラーメソッドを介して構築および表示されます
  • Symfonyのフォームシステムは柔軟性があり、さまざまなニーズに適応しています。データベース関連のCRUD操作の場合、Symfonyフォームシステムが推奨されます。シンプルで非永続的な形式では、ビューに直接HTML埋め込みで十分です。
  • 非エンティティフォーム:
  • この例は、Symfonyビューファイル内で標準のHTMLとして定義された処理フォームを示しています。 このプロセスには、次の3つのステップが含まれます

ファイルの作成:aファイル(

にある)には、フォームのhtml:

に含まれています。

  1. コントローラーメソッド:form1.html.twigsrc/Acme/DemoBundle/Resources/views/Welcomeメソッドを含む
  2. メソッド:
<code class="language-twig">{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block content %}

<h1>Form values</h1>

{% if name is defined %}
<p>Name: {{ name }} </p>
{% endif %}

<form method="post" action="%7B%7B%20path('_form1')%20%7D%7D">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name"><br>
    <input type="submit" name="submit" value="Submit">
</form>

{% endblock %}</code>
  1. ルート定義:WelcomeController form1Actionファイル(in
  2. )が含まれます:
<code class="language-php">use Symfony\Component\HttpFoundation\Request;

// ... other code ...

public function form1Action(Request $request)
{
    $name = 'Not submitted yet';
    if ($request->isMethod('POST') && $request->request->has('submit')) {
        $name = $request->request->get('name');
    }

    return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]);
}</code>
  1. このマップメソッド routing.ymlこのアプローチは機能的ですが、複雑な形式やデータの持続性にはあまり適していません。 src/Acme/DemoBundle/Resources/config
  2. Symfony Entities and Forms:
<code class="language-yaml">_form1:
    path: /form1
    defaults: { _controller: AcmeDemoBundle:Welcome:form1 }</code>
このセクションでは、Symfonyエンティティのフォームの作成と処理を示しています(例:

)。 5つのファイルを使用します。コントローラー、/form1、2つのビューファイル(form1Action

)、および

フォームタイプクラス。

  1. articletype.php:src/Acme/DemoBundle/Formにあります)
<code class="language-twig">{% extends "AcmeDemoBundle::layout.html.twig" %}

{% block content %}

<h1>Form values</h1>

{% if name is defined %}
<p>Name: {{ name }} </p>
{% endif %}

<form method="post" action="%7B%7B%20path('_form1')%20%7D%7D">
    <label for="name">Name:</label>
    <input type="text" id="name" name="name"><br>
    <input type="submit" name="submit" value="Submit">
</form>

{% endblock %}</code>
  1. wellcomecontroller:
<code class="language-php">use Symfony\Component\HttpFoundation\Request;

// ... other code ...

public function form1Action(Request $request)
{
    $name = 'Not submitted yet';
    if ($request->isMethod('POST') && $request->request->has('submit')) {
        $name = $request->request->get('name');
    }

    return $this->render('AcmeDemoBundle:Welcome:form1.html.twig', ['name' => $name]);
}</code>
  1. form2.html.twig:
<code class="language-yaml">_form1:
    path: /form1
    defaults: { _controller: AcmeDemoBundle:Welcome:form1 }</code>
  1. form2saved.html.twig:
<code class="language-php"><?php

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ArticleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', 'text', ['label' => 'Title'])
            ->add('body', 'textarea')
            ->add('save', 'submit')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => 'Acme\DemoBundle\Entity\Article']);
    }

    public function getName()
    {
        return 'article';
    }
}</code>
  1. routing.yml:
<code class="language-php">// ... other uses ...
use Acme\DemoBundle\Entity\Article;
use Acme\DemoBundle\Form\ArticleType;

// ... other methods ...

public function form2Action(Request $request)
{
    $article = new Article();
    $form = $this->createForm(ArticleType::class, $article);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($article);
        $em->flush();
        $this->addFlash('message', 'Article saved!');
        return $this->redirectToRoute('_form2saved');
    }

    return $this->render('AcmeDemoBundle:Welcome:form2.html.twig', ['form' => $form->createView()]);
}

public function form2savedAction()
{
    return $this->render('AcmeDemoBundle:Welcome:form2saved.html.twig');
}
</code>
このアプローチは、より堅牢で保守可能なソリューションを提供するために、Symfonyの機能を活用しています。 フォームの複雑さとデータ処理のニーズに最適な方法を選択してください。 複雑なフォームまたはデータベースの相互作用の場合、エンティティ/フォームアプローチを強くお勧めします。

以上がSymfony 2の構築と処理フォームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。