Zend Framework 2 กรองค่าหลังจากการตรวจสอบความถูกต้องใน InputFilter

ใน InputFilter ฉันมีรหัสนี้:

    $password = new Input('password');
    $password->setRequired(false)
             ->getValidatorChain()
             ->attach(new Validator\StringLength(6));

    $password->getFilterChain()
             ->attach($this->passwordHash);

ปัญหาคือตัวกรองใช้กับค่าก่อนการตรวจสอบความถูกต้อง ดังนั้นเครื่องมือตรวจสอบจึงส่งคืนค่าจริงเสมอ

ฉันสงสัยว่ามีวิธีใดบ้างที่จะทำการกรองหลังจากการตรวจสอบความถูกต้อง


person Rezouce    schedule 16.04.2014    source แหล่งที่มา


คำตอบ (2)


Zend\InputFilter\FileInput class เป็นหนึ่งในประเภทอินพุตที่ทำ การตรวจสอบก่อนที่จะกรอง คุณสามารถดูวิธีการแก้ไขได้ในซอร์สโค้ดและสร้างคลาส PasswordInput ของคุณเองตามโซลูชันนั้น

ดังที่คุณเห็น ในซอร์สโค้ดที่บรรทัด 64 มีส่วนคำสั่ง if ที่ป้องกันไม่ให้ตัวกรองทำงานตราบใดที่ isValid คือ false (ค่าเริ่มต้น) ดังนั้นเครื่องมือตรวจสอบความถูกต้องจะทำงานก่อน จากนั้นเมื่อผู้ปกครอง InputFilter หลังจากการตรวจสอบความถูกต้องเรียก getValue อีกครั้งเพื่อรับค่าจาก FileInput มันจะเรียกใช้ตัวกรอง

person Wilt    schedule 17.03.2015

ดูเหมือนแปลกที่จะกรองหลังจากการตรวจสอบความถูกต้องเนื่องจากตัวกรองสามารถแก้ไขอินพุตก่อนการตรวจสอบความถูกต้องได้ เช่นเดียวกับแถบแท็กหรือตัดแต่งสตริง หากคุณใช้ตัวกรองเช่น \Zend\I18n\Filter\Alnum() คุณสามารถปล่อยให้ตัวกรองลบช่องว่างได้ ดังนั้นถือว่าเป็นแนวทางปฏิบัติที่ไม่ดีในการกรองหลังจากตรวจสอบความถูกต้องของข้อมูลที่คุณป้อน

เช่น ใช้ตัวกรองเหล่านั้น:

// Default settings, deny whitespace
$filter = new \Zend\I18n\Filter\Alnum();
echo $filter->filter("This is (my) content: 123");
// Returns "Thisismycontent123"

// First param in constructor is $allowWhiteSpace
$filter = new \Zend\I18n\Filter\Alnum(true);
echo $filter->filter("This is (my) content: 123");
// Returns "This is my content 123"

โปรดสังเกตว่าค่าเริ่มต้นแตกต่างจากผลลัพธ์ แต่คุณสามารถกรองได้หลังจากการตรวจสอบความถูกต้องแล้ว แต่ฉันคิดว่าคุณต้องกรองด้วยตัวเอง ดังนั้นคุณสามารถเพิ่มวิธีการลงในตัวกรองอินพุตหรือแบบฟอร์มที่คุณเรียกหลังจากการตรวจสอบความถูกต้อง ตัวอย่างเช่น:

public function filterPassword() {
    $filter = new \Zend\I18n\Filter\Alnum(true);
    $inputs = $this->getInputs();
    $password = $filter->filter($inputs['password']);
    return $password;
}

ในคอนโทรลเลอร์ของคุณ คุณสามารถทำสิ่งนี้ได้ เช่น:

public function ExampleController extends AbstractActionController
{
    public function sampleAction() {
        $form = new LoginForm();
        if($form->isValid()) {
            $inputFilter = $form->getInputFilter();
            $filterdPassword = $inputFilter->filterPassword();
        }
        return array('form' => $form);
    }
}
person Kwido    schedule 24.07.2014
comment
จะเกิดอะไรขึ้นหากจำเป็นต้องใช้ตัวกรองเพื่ออัปโหลดไฟล์ไปยังคลาวด์ แต่ต้องทำการตรวจสอบความถูกต้องทั้งหมดก่อนจึงจะสามารถอัปโหลดไฟล์ได้ - person Alexey Kosov; 02.09.2015
comment
@AlexeyKosov ตัวกรองและการตรวจสอบความถูกต้องควรดำเนินการก่อนที่จะบันทึกข้อมูลใด ๆ ไม่ว่าจะเป็นโมเดลหรือการอัปโหลด และฉันไม่รู้ว่าคุณหมายถึงอะไร: จำเป็นต้องมีตัวกรองจึงจะอัปโหลดได้ คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม? เท่าที่ฉันสามารถบอกคุณได้ไม่ได้ใช้ตัวกรองในการอัปโหลด แต่เพียงเพื่อแก้ไขชื่อไฟล์หรือเข้ารหัสหรือถอดรหัสเท่านั้น PS: OP กำลังขอวิธีกรองหลังจากการตรวจสอบความถูกต้องของเขา และฉันให้แนวทางแก่เขา ดังนั้นฉันจึงไม่เห็นว่าทำไมความคิดเห็นของคุณจึงเกี่ยวข้องกัน คำตอบอื่นกำลังพูดถึง fileInputs และฉันไม่ตอบสนองต่อสิ่งนั้น - person Kwido; 08.09.2015