Validasi Phalcon

Phalcon\Validation merupakan komponen validasi independen yang memvalidasi set data yg sering berubah. Komponen ini dapat digunakan untuk mengimplementasikan aturan validasi phalcon pada objek data yang tidak termasuk dalam model atau koleksi.

Contoh berikut menunjukkan penggunaan dasar:

<?php

use Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Email;

$validation = new Phalcon\Validation();

$validation->add('name', new PresenceOf(array(
    'message' => 'The name is required'
)));

$validation->add('email', new PresenceOf(array(
    'message' => 'The e-mail is required'
)));

$validation->add('email', new Email(array(
    'message' => 'The e-mail is not valid'
)));

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

Desain loosely-coupled/tak terikat komponen ini memungkinkan Anda untuk membuat validator Anda sendiri bersama dengan yang disediakan oleh framework.

Memulai Validasi Phalcon 

Rantai validasi dapat diinisialisasi secara langsung dengan hanya menambahkan validator ke objek Phalcon\Validation. Anda dapat menempatkan validasi Anda dalam file terpisah agar kode mudah digunakan kembali (include) dan organisasi file:

<?php

use Phalcon\Validation,
    Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Email;

class MyValidation extends Validation
{
    public function initialize()
    {
        $this->add('name', new PresenceOf(array(
            'message' => 'The name is required'
        )));

        $this->add('email', new PresenceOf(array(
            'message' => 'The e-mail is required'
        )));

        $this->add('email', new Email(array(
            'message' => 'The e-mail is not valid'
        )));
    }
}
<?php

$validation = new MyValidation();

$messages = $validation->validate($_POST);
if (count($messages)) {
    foreach ($messages as $message) {
        echo $message, '<br>';
    }
}

Validator 

Phalcon memberikan satu set built-in validator untuk komponen ini:

Nama Penjelasan Contoh
PresenceOf Memvalidasi bahwa nilai kolom yang tidak null atau string kosong. Contoh
Identical Memvalidasi bahwa nilai bidang adalah sama dengan nilai tertentu Contoh
Email Memvalidasi bahwa bidang berisi format email yang valid Contoh
ExclusionIn Memvalidasi bahwa nilai tidak berada dalam daftar nilai yang mungkin Contoh
InclusionIn Memvalidasi bahwa nilai berada dalam daftar nilai yang mungkin Contoh
Regex Memvalidasi bahwa nilai field sesuai dengan ekspresi reguler Contoh
StringLength Memvalidasi panjang string Contoh
Between Memvalidasi bahwa nilai antara dua nilai Contoh
Confirmation Memvalidasi bahwa nilai sama dengan kolom tertentu dalam data Contoh

Contoh berikut ini menjelaskan cara membuat validator tambahan untuk komponen ini:

<?php

use Phalcon\Validation\Validator,
    Phalcon\Validation\ValidatorInterface,
    Phalcon\Validation\Message;

class IpValidator extends Validator implements ValidatorInterface
{

    /**
     * Executes the validation
     *
     * @param Phalcon\Validation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate($validator, $attribute)
    {
        $value = $validator->getValue($attribute);

        if (!filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) {

            $message = $this->getOption('message');
            if (!$message) {
                $message = 'The IP is not valid';
            }

            $validator->appendMessage(new Message($message, $attribute, 'Ip'));

            return false;
        }

        return true;
    }

}

Sangat penting bahwa validator mengembalikan nilai boolean yang valid menunjukkan jika validasi berhasil atau tidak.

Pesan validasi 

Phalcon \ Validation memiliki  subsistem pesan yang menyediakan cara yang fleksibel untuk produksi atau menyimpan pesan validasi yg dihasilkan selama proses validasi.

Setiap pesan terdiri dari sebuah instance dari kelas Phalcon \ Validation \ Message.  Himpunan pesan yang dihasilkan dapat diambil dengan method getMessages () . Setiap pesan berisi informasi lengkap seperti atribut yang dihasilkan pesan atau jenis pesan:

<?php

$messages = $validation->validate();
if (count($messages)) {
    foreach ($validation->getMessages() as $message) {
        echo "Message: ", $message->getMessage(), "\n";
        echo "Field: ", $message->getField(), "\n";
        echo "Type: ", $message->getType(), "\n";
    }
}

metode getMessages()  dapat di-override dalam kelas validasi untuk menggantikan / menerjemahkan pesan standar yang dihasilkan oleh validator:

<?php

class MyValidation extends Phalcon\Validation
{

    public function initialize()
    {
        // ...
    }

    public function getMessages()
    {
        $messages = array();
        foreach (parent::getMessages() as $message) {
            switch ($message->getType()) {
                case 'PresenceOf':
                    $messages[] = 'The field ' . $message->getField() . ' is mandatory';
                    break;
            }
        }
        return $messages;
    }
}

Atau Anda dapat memberikan parameter ‘message’  untuk mengubah pesan default di setiap validator:

<?php

use Phalcon\Validation\Validator\Email;

$validation->add('email', new Email(array(
    'message' => 'The e-mail is not valid'
)));

Secara default, ‘getMessages’ mengembalikan semua pesan yang dihasilkan selama validasi. Anda dapat menyaring pesan untuk kolom tertentu dengan menggunakan metode ‘filter’:

<?php

$messages = $validation->validate();
if (count($messages)) {
    //Filter only the messages generated for the field 'name'
    foreach ($validation->getMessages()->filter('name') as $message) {
        echo $message;
    }
}

Penyaringan Data 

Data dapat disaring sebelum validasi memastikan bahwa data berbahaya atau tidak benar tidak divalidasi.

<?php

$validation = new Phalcon\Validation();

$validation
    ->add('name', new PresenceOf(array(
        'message' => 'The name is required'
    )))
    ->add('email', new PresenceOf(array(
        'message' => 'The email is required'
    )));

//Filter any extra space
$validation->setFilters('name', 'trim');
$validation->setFilters('email', 'trim');

Filter dan sanitasi Phalcon dilakukan dengan menggunakan komponen filter . Anda dapat menambahkan filter untuk komponen ini atau menggunakan yang built-in.

Event Validasi  

Ketika validasi diatur dalam kelas, Anda dapat menerapkan ‘beforeValidation’ dan metode ‘afterValidation’ untuk melakukan pemeriksaan tambahan, filter, bersih-bersih, dll. Jika metode ‘beforeValidation’ mengembalikan false validasi secara otomatis dibatalkan:

<?php

use Phalcon\Validation;

class LoginValidation extends Validation
{

    public function initialize()
    {
        // ...
    }

    /**
     * Executed before validation
     *
     * @param array $data
     * @param object $entity
     * @param Phalcon\Validation\Message\Group $messages
     * @return bool
     */
    public function beforeValidation($data, $entity, $messages)
    {
        if ($this->request->getHttpHost() != 'admin.mydomain.com') {
            $messages->appendMessage(new Message('Only users can log on in the administration domain'));
            return false;
        }
        return true;
    }

    /**
     * Executed after validation
     *
     * @param array $data
     * @param object $entity
     * @param Phalcon\Validation\Message\Group $messages
     */
    public function afterValidation($data, $entity, $messages)
    {
        //... add additional messages or perform more validations
    }

}

Membatalkan Validasi 

Secara default semua validator ditugaskan ke kolom tertentu akan diujikan terlepas jika salah satu dari mereka telah gagal atau tidak. Anda dapat mengubah perilaku ini dengan mengatakan komponen validasi validator yang dapat menghentikan validasi:

<?php

use Phalcon\Validation\Validator\PresenceOf,
    Phalcon\Validation\Validator\Regex;

$validation = new Phalcon\Validation();

$validation
    ->add('telephone', new PresenceOf(array(
        'message' => 'The telephone is required',
        'cancelOnFail' => true
    )))
    ->add('telephone', new Regex(array(
        'message' => 'The telephone is required',
        'pattern' => '/\+44 [0-9]+/'
    )))
    ->add('telephone', new StringLength(array(
        'minimumMessage' => 'The telephone is too short',
        'min' => 2
    )));

Validator pertama memiliki opsi ‘cancelOnFail’ dengan nilai true, karena itu jika validator tsb gagal, validator yang tersisa dalam rantai tidak dieksekusi.

Jika Anda membuat validator kustom, Anda dapat secara dinamis menghentikan rantai validasi dengan menetapkan opsi ‘cancelOnFail’:

<?php

use Phalcon\Validation\Validator,
    Phalcon\Validation\ValidatorInterface,
    Phalcon\Validation\Message;

class MyValidator extends Validator implements ValidatorInterface
{

    /**
     * Executes the validation
     *
     * @param Phalcon\Validation $validator
     * @param string $attribute
     * @return boolean
     */
    public function validate($validator, $attribute)
    {
        // If the attribute value is name we must stop the chain
        if ($attribute == 'name') {
            $validator->setOption('cancelOnFail', true);
        }

        //...
    }

}