nattapong99 / book

0 stars 0 forks source link

Form Events #12

Open nattapong99 opened 6 years ago

nattapong99 commented 6 years ago

Form Events

Form component ได้จัดเตรียมโครงสร้างที่มีกระบวนการต่าง ๆ เพื่อช่วยให้คุณสามารถกำหนดรูปแบบฟอร์มของคุณได้ โดยการใช้ EventDispatcher component การใช้ form events ทำให้คุณสามารถแก้ไข field หรือข้อมูลในขั้นตอนต่าง ๆ ของกระบวนการทำงานได้ ตั้งแต่ขั้นตอน population ของฟอร์มไปจนถึงการ submission ส่งข้อมูลจาก request

การใช้งาน event listener ทำได้ง่ายมากผ่าน Form component

ตัวอย่างการใช้งานฟังก์ชั่น FormEvents::PRE_SUBMIT

01

The Form Workflow¶

The Form Submission Workflow

02

1) Pre-populating the Form (FormEvents::PRE SET DATA and FormEvents::POST_ SET_DATA)

03

มีสอง event ที่ถูกจัดการไปช่วง pre-population เมื่อมีการเรียกใช้ Form::setData() ซึ่งสอง event นั้นได้แก่ FormEvents::PRE_SET_DATA และ FormEvents::POST_SET_DATA

A) The FormEvents::PRE_ SET_DATA Event

event FormEvents::PRE_SET_DATA ถูกจัดการที่จุดเริ่มต้นของเมธอด Form::setData() event นี้สามารถใช้งานเพื่อ

Data Type Value
Model data null
Normalized data null
View data null
ในช่วง FormEvents::PRE_SET_DATA, การใช้ Form::setData() จะไม่สามารถใช้งานได้ แต่ถ้าหาก
คุณต้องการแก้ไขข้อมูล คุณสามารถใช้ `FormEvent::setData()` แทนได้

FormEvents::PRE_ SET_DATA in the Form component

The Symfony\Component\Form\Extension\Core\Type\CollectionType form type นี้ขึ้นอยู่กับ the Symfony\Component\Form\Extension\Core\EventListener\ResizeFormListener โดย FormEvents::PRE_SET_DATA สั่งให้เรียงลำดับ form field โดยขึ้นอยู่กับข้อมูลจาก pre-populated object โดยการลบและเพิ่มแถวของฟอร์มทั้งหมด

B) The FormEvents::POST_ SET_DATA Event

event FormEvents::POST_SET_DATA ถูกจัดการที่ีจุดสิ้นสุดของเมธอด Form::setData() โดย event นี้ส่วนใหญ่ถูกใช้งานสำหรับอ่านข้อมูลหลังจากผ่านช่วง pre-populated ของฟอร์ม

Data Type Value
Model data ข้อมูล Model ถูกกำหนดค่าผ่านเมธอด setData()
Normalized data ข้อมูล Model ถูกแปลงโดยการใช้ model transformer
View data ข้อมูล Normalized ถูกแปลงโดยการใช้ view transformer

FormEvents::POST_ SET_DATA in the Form component คลาส Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener ใน event FormEvents::POST_SET_DATA โดยคลาสนี้ทำหน้าที่ในการเก็บข้อมูลเกี่ยวกับฟอร์ม จาก denormalized model and view data

2) Submitting a Form (FormEvents::PRE_SUBMIT, FormEvents::SUBMIT and FormEvents::POST_SUBMIT)

04

มีสาม events ที่ถูกจัดการเมื่อมีการเรียก Form::handleRequest() หรือ Form::submit() สาม events นี้ได้แก่ FormEvents::PRE_SUBMIT, FormEvents::SUBMIT, FormEvents::POST_SUBMIT

A) The FormEvents::PRE_SUBMIT Event

event FormEvents::PRE_SUBMIT ถูกจัดการที่จุดเริ่มต้นของเมธอด Form::submit() event นี้สามารถใช้เพื่อ

Data Type Value
Model data ข้อมูล Model ถูกกำหนดค่าผ่านเมธอด setData()
Normalized data ข้อมูล Model ถูกแปลงโดยการใช้ model transformer
View data ข้อมูล Normalized ถูกแปลงโดยการใช้ view transformer

FormEvents::PRE_SUBMIT in the Form component Symfony\Component\Form\Extension\Core\EventListener\TrimListener ใน event FormEvents::PRE_SUBMIT เป็นคำสั่งเพื่อ trim request's data (สำหรับ string values) Symfony\Component\Form\Extension\Csrf\EventListener\CsrfValidationListener ใน event FormEvents::PRE_SUBMIT เป็นคำสั่งเพื่อ validate CSRF token

B) The FormEvents::SUBMIT Event

event FormEvents::SUBMIT ถูกจัดการก่อนเมธอด Form::submit() แปลงค่าข้อมูล normalized กลับไปเป็น model และ view data โดย event นี้สามารถใช้งานเพื่อเปลี่ยนข้อมูลของ normalized

Data Type Value
Model data ข้อมูล Model ถูกกำหนดค่าผ่านเมธอด setData()
Normalized data ข้อมูลจาก request ถูกแปลงกลับจาก request โดยการใช้ view transformer
View data ข้อมูล Normalized ถูกแปลงโดยการใช้ view transformer

FormEvents::SUBMIT in the Form component Symfony\Component\Form\Extension\Core\EventListener\FixUrlProtocolListener ใน event FormEvents::SUBMIT มีคำสั่งเพื่อกำหนดค่า protocol ไปยัง URL field ที่ถูกส่งมาโดยไม่มี protocol

C) The FormEvents::POST_SUBMIT Event

event FormEvents::POST_SUBMIT ถูกจัดการหลังจากเมธอด Form::submit() เมื่อข้อมูล model และ view ได้ถูก denormalized แล้ว โดย event นี้สามารถใช้เพื่อรับข้อมูลมาหลังจาก denormalization

Data Type Value
Model data ข้อมูล Normalized ถูกแปลงกลับโดยการใช้ model transformer
Normalized data ข้อมูลจาก request ถูกแปลงกลับจาก request โดยการใช้ view transformer
View data ข้อมูล Normalized ถูกแปลงโดยการใช้ view transformer

FormEvents::POST_SUBMIT in the Form component Symfony\Component\Form\Extension\DataCollector\EventListener\DataCollectorListener ใน event FormEvents::POST_SUBMIT มีคำสั่งเพื่อเก็บข้อมูลเกี่ยวกับฟอร์ม Symfony\Component\Form\Extension\Validator\EventListener\ValidationListener ใน event FormEvents::POST_SUBMIT มีการ validate denormalized object โดยอัตโนมัติ

Registering Event Listeners or Event Subscribers

โดยคำสั่งที่สามารถใช้งานกับ Form events จำเป็นที่จะต้องมีการสร้าง event listener หรือ event subscriber แล้วลงทะเบียนมันลงไปใน event

โดยชื่อของแต่ละ "form" event ได้ถูกกำหนดเป็น Constant อยู่ในคลาส FormEvents โดยแต่ละ event callback (เมธอด listener หรือ subscriber) ถูกส่งผ่านอาร์กิวเมนต์เดี่ยว ซึ่งคือ instance ของ FormEvent โดย event object มีข้อมูลอ้างอิงไปยัง state ปัจจุบันของฟอร์มและข้อมูลปัจจุบันที่กำลังจัดการอยู่

Name FormEvents Constant Event's Data
form.pre_set_data FormEvents::PRE_SET_DATA Model data
form.post_set_data FormEvents::POST_SET_DATA Model data
form.pre_bind FormEvents::PRE_SUBMIT Request data
form.bind FormEvents::SUBMIT Normalized data
form.post_bind FormEvents::POST_SUBMIT View data

Event Listeners

โดย event listener อาจเป็น type ใด ๆ ของ valid callable

การสร้างและการนำ event listener ไปใช้กับฟอร์ม

05

เมื่อคุณได้สร้างคลาส form type ขึ้นมา คุณสามารถใช้เมธอด callback เพื่อให้โค้ดสามารถอ่านได้ง่ายขึ้น

06

Event Subscribers

Event subscribers มีการใช้งานที่แตกต่างกัน

// src/AppBundle/Form/EventListener/AddEmailFieldListener.php
namespace AppBundle\Form\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Extension\Core\Type\EmailType;

class AddEmailFieldListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SET_DATA => 'onPreSetData',
            FormEvents::PRE_SUBMIT   => 'onPreSubmit',
        );
    }

    public function onPreSetData(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();

        // Check whether the user from the initial data has chosen to
        // display his email or not.
        if (true === $user->isShowEmail()) {
            $form->add('email', EmailType::class);
        }
    }

    public function onPreSubmit(FormEvent $event)
    {
        $user = $event->getData();
        $form = $event->getForm();

        if (!$user) {
            return;
        }

        // Check whether the user has chosen to display his email or not.
        // If the data was submitted previously, the additional value that
        // is included in the request variables needs to be removed.
        if (true === $user['show_email']) {
            $form->add('email', EmailType::class);
        } else {
            unset($user['email']);
            $event->setData($user);
        }
    }
}

การลงทะเบียน event subscriber ทำได้โดยใช้เมธอด addEventSubscriber()

07

source