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 โดยการลบและเพิ่มแถวของฟอร์มทั้งหมด
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)
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
FormEvents::SUBMIT in the Form component
Symfony\Component\Form\Extension\Core\EventListener\FixUrlProtocolListener
ใน event FormEvents::SUBMIT มีคำสั่งเพื่อกำหนดค่า protocol ไปยัง URL field ที่ถูกส่งมาโดยไม่มี
protocol
โดย event listener อาจเป็น type ใด ๆ ของ valid callable
การสร้างและการนำ event listener ไปใช้กับฟอร์ม
เมื่อคุณได้สร้างคลาส form type ขึ้นมา คุณสามารถใช้เมธอด callback เพื่อให้โค้ดสามารถอ่านได้ง่ายขึ้น
Event Subscribers
Event subscribers มีการใช้งานที่แตกต่างกัน
ทำให้การปรับปรุงอ่านได้ง่ายขึ้น
Listening เพื่อจัดการหลาย ๆ events
จัดกลุ่มหลาย ๆ listeners ภายในคลาสเดียว
// 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);
}
}
}
Form Events
Form component ได้จัดเตรียมโครงสร้างที่มีกระบวนการต่าง ๆ เพื่อช่วยให้คุณสามารถกำหนดรูปแบบฟอร์มของคุณได้ โดยการใช้ EventDispatcher component การใช้ form events ทำให้คุณสามารถแก้ไข field หรือข้อมูลในขั้นตอนต่าง ๆ ของกระบวนการทำงานได้ ตั้งแต่ขั้นตอน population ของฟอร์มไปจนถึงการ submission ส่งข้อมูลจาก request
การใช้งาน event listener ทำได้ง่ายมากผ่าน Form component
ตัวอย่างการใช้งานฟังก์ชั่น
FormEvents::PRE_SUBMIT
The Form Workflow¶
The Form Submission Workflow
1) Pre-populating the Form (FormEvents::PRE SET DATA and FormEvents::POST_ SET_DATA)
มีสอง 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 นี้สามารถใช้งานเพื่อnull
null
null
B) The FormEvents::POST_ SET_DATA Event
event
FormEvents::POST_SET_DATA
ถูกจัดการที่ีจุดสิ้นสุดของเมธอดForm::setData()
โดย event นี้ส่วนใหญ่ถูกใช้งานสำหรับอ่านข้อมูลหลังจากผ่านช่วง pre-populated ของฟอร์มsetData()
2) Submitting a Form (FormEvents::PRE_SUBMIT, FormEvents::SUBMIT and FormEvents::POST_SUBMIT)
มีสาม 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 นี้สามารถใช้เพื่อsetData()
B) The FormEvents::SUBMIT Event
event
FormEvents::SUBMIT
ถูกจัดการก่อนเมธอดForm::submit()
แปลงค่าข้อมูล normalized กลับไปเป็น model และ view data โดย event นี้สามารถใช้งานเพื่อเปลี่ยนข้อมูลของ normalizedsetData()
C) The FormEvents::POST_SUBMIT Event
event
FormEvents::POST_SUBMIT
ถูกจัดการหลังจากเมธอดForm::submit()
เมื่อข้อมูล model และ view ได้ถูก denormalized แล้ว โดย event นี้สามารถใช้เพื่อรับข้อมูลมาหลังจาก denormalizationRegistering 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 ปัจจุบันของฟอร์มและข้อมูลปัจจุบันที่กำลังจัดการอยู่form.pre_set_data
FormEvents::PRE_SET_DATA
form.post_set_data
FormEvents::POST_SET_DATA
form.pre_bind
FormEvents::PRE_SUBMIT
form.bind
FormEvents::SUBMIT
form.post_bind
FormEvents::POST_SUBMIT
Event Listeners
โดย event listener อาจเป็น type ใด ๆ ของ valid callable
การสร้างและการนำ event listener ไปใช้กับฟอร์ม
เมื่อคุณได้สร้างคลาส form type ขึ้นมา คุณสามารถใช้เมธอด callback เพื่อให้โค้ดสามารถอ่านได้ง่ายขึ้น
Event Subscribers
Event subscribers มีการใช้งานที่แตกต่างกัน
การลงทะเบียน event subscriber ทำได้โดยใช้เมธอด
addEventSubscriber()
source