برنامه نویسی

PHP – اعتبارسنجی داده خود را در PHP ایجاد کنید: گام به گام

در این آموزش، من به شما یاد خواهم داد که چگونه با ساختن کتابخانه اعتبارسنجی خود قدم به قدم، یک اعتبارسنجی داده سفارشی در PHP ایجاد کنید. اعتبار سنجی داده ها ابزارهای ضروری برای هر توسعه دهنده ای است که باید از معتبر بودن و ایمن بودن داده های ارسالی توسط کاربر اطمینان حاصل کند. در پایان این آموزش، شما درک کاملی از نحوه ایجاد اعتبارسنجی داده های سفارشی در PHP خواهید داشت که به شما امکان می دهد ورودی های کاربر را بهتر مدیریت کنید و از امنیت برنامه های خود اطمینان حاصل کنید.

مرحله 1: ایجاد کلاس اعتبار سنجی

اولین قدم ایجاد کلاسی است که اعتبارسنجی را انجام دهد. این کلاس باید بتواند قوانین اعتبارسنجی را برای هر فیلدی که می‌خواهیم اعتبار سنجی کنیم ذخیره کند، و همچنین زمانی که فراخوانی می‌شود، آن قوانین را تأیید کند.

در اینجا مثالی از یک کلاس اعتبارسنجی ساده آورده شده است:

<?php

namespace DevCoder\Validator;

use DevCoder\Validator\Assert\ValidatorInterface;
use InvalidArgumentException;
use function get_class;
use function gettype;
use function is_array;
use function is_object;
use function sprintf;

class Validation
{
    /**
     * @var array<string,array>
     */
    private $validators;

    /**
     * @var array<string,string>
     */
    private $errors = [];

    /**
     * @var array
     */
    private $data = [];

    public function __construct(array $fieldValidators)
    {
        foreach ($fieldValidators as $field => $validators) {
            if (!is_array($validators)) {
                $validators = [$validators];
            }
            $this->addValidator($field, $validators);
        }
    }

    public function validate(array $data): bool
    {
        $this->data = $data;

        /**
         * @var $validators array<ValidatorInterface>
         */
        foreach ($this->validators as $field => $validators) {
            if (!isset($this->data[$field])) {
                $this->data[$field] = null;
            }

            foreach ($validators as $validator) {
                if ($validator->validate($this->data[$field]) === false) {
                    $this->addError($field, (string)$validator->getError());
                }
            }

        }
        return $this->getErrors() === [];
    }

    /**
     * @return array<string,string>
     */
    public function getErrors(): array
    {
        return $this->errors;
    }

    /**
     * @return array
     */
    public function getData(): array
    {
        return $this->data;
    }

    private function addError(string $field, string $message): void
    {
        $this->errors[$field][] = $message;
    }

    /**
     * @param string $field
     * @param array<ValidatorInterface> $validators
     * @return void
     */
    private function addValidator(string $field, array $validators): void
    {
        foreach ($validators as $validator) {
            if (!$validator instanceof ValidatorInterface) {
                throw new InvalidArgumentException(sprintf(
                    $field . ' validator must be an instance of ValidatorInterface, "%s" given.',
                    is_object($validator) ? get_class($validator) : gettype($validator)
                ));
            }

            $this->validators[$field][] = $validator;
        }
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 2: ایجاد کلاس های قانون برای اعتبار سنجی داده ها

اکنون که کلاس Validator را ایجاد کرده ایم، قدم بعدی ایجاد قوانین اعتبارسنجی خودمان است. از این قوانین برای بررسی معتبر بودن یا نبودن داده های ارسالی استفاده می شود. ما آنها را در فایل های جداگانه، یکی برای هر قانون اعتبار سنجی ایجاد می کنیم. هر فایل قانون اعتبارسنجی باید دارای کلاسی باشد که به نام قانون پیاده سازی شده است. به عنوان مثال، اگر یک قانون اعتبارسنجی برای بررسی صحیح بودن یک مقدار داشته باشیم، نام کلاس را Integer می گذاریم.

ValidatorInterface

<?php

namespace DevCoder\Validator\Assert;

interface ValidatorInterface
{
    public function validate($value): bool;
    public function getError(): ?string;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Abstract Validator

<?php

namespace DevCoder\Validator\Assert;

abstract class AbstractValidator implements ValidatorInterface
{
    /**
     * @var string|null
     */
    protected $error;

    public function getError(): ?string
    {
        return $this->error;
    }

    protected function error(string $message, array $context): void
    {
        $replace = [];
        foreach ($context as $key => $value) {
            if (is_object($value)) {
                $value = method_exists($value, '__toString') ? (string)$value : get_class($value);
            } elseif (is_array($value)) {
                $value = json_encode($value);
            } else {
                $value = (string)$value;
            }
            $replace['{{ ' . $key . ' }}'] = $value;
        }

        $this->error = strtr($message, $replace);
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عدد صحیح

<?php

declare(strict_types=1);

namespace DevCoder\Validator\Assert;

use function ctype_digit;
use function is_int;
use function strval;

class Integer extends AbstractValidator
{
    /**
     * @var string
     */
    private $invalidMessage = 'This value should be of type {{ type }}.';
    private $minMessage = '{{ value }} should be {{ limit }} or more.';
    private $maxMessage = '{{ value }} should be {{ limit }} or less.';

    /**
     * @var int|null
     */
    private $min;
    /**
     * @var int|null
     */
    private $max;

    public function validate($value): bool
    {
        if ($value === null) {
            return true;
        }

        if (ctype_digit(strval($value)) === false) {
            $this->error($this->invalidMessage, ['value' => $value, 'type' => 'integer']);
            return false;
        }

        if (is_int($this->min) && $value < $this->min) {
            $this->error($this->minMessage, ['value' => $value, 'limit' => $this->min]);
            return false;
        }

        if (is_int($this->max) && $value > $this->max) {
            $this->error($this->maxMessage, ['value' => $value, 'limit' => $this->max]);
            return false;
        }

        return true;
    }

    public function invalidMessage(string $invalidMessage): self
    {
        $this->invalidMessage = $invalidMessage;
        return $this;
    }

    public function minMessage(string $minMessage): self
    {
        $this->minMessage = $minMessage;
        return $this;
    }

    public function maxMessage(string $maxMessage): self
    {
        $this->maxMessage = $maxMessage;
        return $this;
    }

    public function min(int $min): self
    {
        $this->min = $min;
        return $this;
    }

    public function max(int $max): self
    {
        $this->max = $max;
        return $this;
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تهی نیست

<?php

declare(strict_types=1);

namespace DevCoder\Validator\Assert;

class NotNull extends AbstractValidator
{
    private $message = 'This value should not be null.';

    public function validate($value): bool
    {
        if ($value === null) {
            $this->error($this->message, ['value' => $value]);
            return false;
        }

        return true;
    }

    public function message(string $message): self
    {
        $this->message = $message;
        return $this;
    }
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 3: ایجاد یک نمونه از کلاس Validation

این شیء آرایه ای از گزینه های اعتبارسنجی را به عنوان ورودی می گیرد. کلیدهای آرایه نام فیلدها و مقادیر آرایه‌های اعتبارسنجی هستند.

<?php
$validation = new Validator([
    'age' => [(new Integer())->min(18)->max(99), new NotNull()],
    'number_of_children' => [new NotNull(), new Integer()],
    'salary' => [new NotNull(), new Integer()],
]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مرحله 4: اعتبارسنجی داده ها

هنگامی که نمونه ای از کلاس Validation ایجاد کردید، می توانید داده ها را با فراخوانی متد ()validate کلاس Validation اعتبارسنجی کنید. اگر تمام قوانین اعتبارسنجی رعایت شود، این روش true و در غیر این صورت نادرست است.

<?php

if ($validation->validate($_POST) === true) {
    $data = $validation->getData();
    // save in database
    // redirect in another page
}

return render('template.html.php', [
    'errors' => $validation->getErrors()
]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نمونه قوانین دیگری که می توان اضافه کرد

$validation = new Validation([
    'email' => [new NotNull(), new Email()],
    'password' => new NotNull(),
    'firstname' => [new NotNull(), (new StringLength())->min(3), new Alphabetic()],
    'lastname' => [(new StringLength())->min(3)],
    'gender' => new Choice(['Mme', 'Mr', null]),
    'website' => [new NotNull(), new Url()],
    'age' => [new NotNull(), (new Integer())->min(18)],
    'invoice_total' => [new NotNull(), new Numeric()],
    'active' => [new NotNull(), new Custom(function ($value) {
        return is_bool($value);
    })]
]);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای مشاهده سایر قوانین اعتبار سنجی که می توانند اضافه شوند، مخزن GitHub من را در آدرس اینترنتی زیر بررسی کنید: https://github.com/devcoder-xyz/php-validator/tree/main/src/Assert

ایده آل برای پروژه های کوچک
ساده و آسان!
https://github.com/devcoder-xyz/php-validator

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا