Zabezpieczenie formularza Zend Framework 2

0

Cześć chciałbym rozwiązać problem dublowania wpisów w bazie, poprzez odświeżenie wysłanego formularza. Przeszukując dokumentację modułu Zend\Form nie znalazłem nic na ten temat. Czy Zend-form nie udostępnia żadnego tego typu zabezpieczenia? Bo jeżeli gdzieś jest, a nie doszukałem się to nie ma sensu, żebym pisał swoje zabezpieczenie.

Czy gdybym ewentualnie pisał swoje zabezpieczenie jest opcja podpiąć to jakoś pod moduł zend-form?
Czy zabezpieczanie poprzez dodanie klucza formularza do sesji i porównywanie go przed dodaniem wpisu do bazy byłoby wystarczające?

Pozdrawiam

0

Tak to to czego szukałem. Dzięki.
Jednakże dostaje błąd podczas implementacji :

A plugin by the name "PostRedirectGet" was not found in the plugin manager Zend\Mvc\Controller\PluginManager 

Ok, plugin trzeba było doinstalować, bo nie był w standardowej bibliotece. Teraz wszystko jest ok.
Dzięki :)

0

Mam jeszcze takie jedno pytanie, a że wiąże się bezpośrednio z formularzami to może nie będę tworzył nowego tematu.
Mianowicie - jaka jest dobra praktyka przy walidacji formularzy? Czy gdy tworzę sobie fieldset to mogę tam określić, np. minimalną ilość znaków, maksymalną, czy coś w tym stylu i później zostanie to automatycznie sprawdzone, przy przesłaniu formularza? Bo z tego co widziałem, to wiele osób tworzy osobną klasę np. RegisterFilter i dodaje tam pola formularzy wraz z regułami walidacji, gdzie struktura jest taka sama jak przy tworzeniu fieldset-u, więc jest to jakby powielanie tego samego pod inną nazwą.

0

Ok mam taką koncepcję:

 <?php
<?php
/**
 * Created by PhpStorm.
 * User: Patryk
 * Date: 2016-10-03
 * Time: 20:24
 */namespace Users\Form;

use Zend\Form\Fieldset;
use Zend\Hydrator\Reflection as ReflectionHydrator;
use Users\Model\Users;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Validator\EmailAddress;
use Zend\Captcha;
use Zend\Validator\StringLength;



class UsersFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function getInputFilterSpecification()
    {
        return [
          'login' => [

              'options' => [
                  'label' => 'Login',
              ],
              'validators' => [
                  [
                      'name' => StringLength::class,
                      'label' => 'Login',
                      'options' => [
                          'min' => 5,
                          'max' => 20,
                          'message' => "Wartość pola Login musi być dłuższa niż %min%, a krótsza od %max%",
                      ],

                  ],

                  [
                      'name' => EmailAddress::class,
                      'options' => [
                          'messages' => [
                              'emailAddressInvalidFormat' => 'Wpisana wartośc nie jest typu "email". Użyj formatu: local-part@hostname '
                          ],
                          'domain' => true,
                      ],
                  ],
              ],
          ]
        ];
    }

    public function init()
    {
        $this->setHydrator(new ReflectionHydrator());
        $this->setObject(new Users());

        $this->add([
                'type' => 'hidden',
                'name' => 'id',
        ]);

        $this->add([
                'type' => 'text',
                'name' => 'login',
                'options' => [
                    'label' => 'Login',
                    'size' => '30',
                ],
        ]);

        $this->add([
                'type' => 'password',
                'name' => 'password',
                'options' => [
                    'label' => "Hasło",
                ],
        ]);

        $this->add([
            'type' => 'text',
            'name' => 'name',
            'options' => [
                'label' => "Imię",
            ],
        ]);

        $this->add([
            'required' => true,
            'type' => 'Email',
            'name' => 'email',
            'options' => [
                'label' => "Email",
            ],
        ]);

       /* $this->add([
            'type' => 'captcha',
            'name' => 'captcha',
            'options' => [
                'label' => 'Zabezpiecznie antyspamowe',
                'captcha' => new Captcha\Dumb(),
            ],
        ]);*/

        $this->add([
            'type' => 'submit',
            'name' => 'submit',
        ]);
    }

}

Zastanawiam się czy takie rozwiązanie jest poprawne - tego fieldsteu będę używał np. jeszcze do edycji danych użytkownika, więc mógłbym go ponownie wykorzystać.
A co np. jeżeli powiedzmy miałbym sekcję komentarzy pod artykułami i w opcjach byłaby tam możliwość dodania swojego adresu email - musiałbym od nowa definiować np. translację błędów przy złym typie danych (nie email).

Jak wy tworzycie sobie walidacje formularzy tak, aby było w miarę przejrzyście i bez zbędnego powielania kodu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1