Zend Framework 2, memfilter nilai setelah validasi di InputFilter

Dalam InputFilter saya memiliki kode ini:

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

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

Masalahnya adalah filter diterapkan pada nilai sebelum validasi, sehingga validator selalu mengembalikan nilai true.

Saya bertanya-tanya apakah ada cara untuk melakukan pemfilteran setelah validasi.


person Rezouce    schedule 16.04.2014    source sumber


Jawaban (2)


Kelas Zend\InputFilter\FileInput adalah salah satu tipe masukan yang berfungsi validasi sebelum memfilter. Anda dapat melihat bagaimana mereka menyelesaikannya di kode sumber dan membuat kelas PasswordInput Anda sendiri berdasarkan solusi tersebut.

Seperti yang Anda lihat di kode sumber pada baris 64 terdapat klausa if yang mencegah filter berjalan selama isValid adalah false (nilai awal). Jadi validator dijalankan terlebih dahulu dan kemudian ketika induk InputFilter setelah validasi memanggil getValue lagi untuk mendapatkan nilai dari FileInput ia menjalankan filter.

person Wilt    schedule 17.03.2015

Tampaknya aneh memfilter setelah validasi karena masukan sebelum validasi dapat diedit oleh filter. Seperti strip tag atau potong talinya. Jika Anda menggunakan filter seperti \Zend\I18n\Filter\Alnum() Anda bisa membiarkannya menghilangkan spasi. Jadi anggaplah memfilter setelah memvalidasi masukan Anda sebagai praktik yang buruk.

Misalnya, ambil filter tersebut:

// 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"

Perhatikan bahwa nilai awal berbeda dari hasilnya. Tapi Anda bisa memfilter setelah validasi, tapi saya rasa Anda harus melakukannya sendiri. Jadi Anda bisa menambahkan metode ke filter input atau formulir yang Anda panggil setelah validasi. Misalnya:

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

Di pengontrol Anda, Anda dapat melakukan ini misalnya:

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
Bagaimana jika filter diperlukan untuk mengunggah file ke cloud, namun semua validasi harus dilakukan terlebih dahulu? - person Alexey Kosov; 02.09.2015
comment
@AlexeyKosov, filter dan validasi harus dijalankan sebelum menyimpan data apa pun, baik itu model atau unggahan. Dan saya tidak mengerti apa yang Anda maksud dengan: filter diperlukan untuk mengunggah. Bisakah Anda menjelaskannya lebih jauh? Sejauh yang saya tahu Anda tidak menggunakan filter untuk mengunggah, tetapi hanya untuk mengubah nama file atau en- atau mendekripsi. PS: OP menanyakan cara untuk melakukan pemfilteran setelah validasinya dan saya memberinya pendekatan, jadi saya tidak mengerti mengapa komentar Anda ada hubungannya. Jawaban lainnya berbicara tentang fileInputs dan saya tidak menanggapinya. - person Kwido; 08.09.2015