برنامه نویسی

ایجاد یک برنامه CRUD با PHP، MySQL و Lithe

Summarize this content to 400 words in Persian Lang
این راهنمای گام به گام به شما یاد می دهد که چگونه یک برنامه CRUD با استفاده از PHP، MySQL و چارچوب Lithe بسازید. ما همه چیز را از پیکربندی پایگاه داده گرفته تا اجرای کنترلرها برای مدیریت عملیات CRUD را پوشش خواهیم داد.

پیکربندی محیط

قبل از شروع، مطمئن شوید که Composer را روی دستگاه خود نصب کرده اید. Composer یک ابزار ضروری برای مدیریت وابستگی ها در پروژه های PHP است. اگر Composer ندارید، می توانید آن را از وب سایت رسمی Composer دانلود و نصب کنید.

ایجاد یک پروژه Lithe جدید

برای ایجاد یک پروژه جدید با چارچوب Lithe، ترمینال را باز کرده و دستور زیر را اجرا کنید:

composer create-project lithephp/lithephp crud-app

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

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

با این کار یک دایرکتوری به نام ایجاد می شود crud-app، جایی که تمام فایل های پروژه Lithe نصب خواهند شد. پس از نصب، به دایرکتوری پروژه بروید:

cd crud-app

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

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

پیکربندی پایگاه داده

اکنون باید اتصال پایگاه داده را پیکربندی کنید. فایل را پیدا کنید .env در ریشه پروژه این فایل متغیرهای محیطی را که Lithe هنگام اجرا از آنها استفاده خواهد کرد ذخیره می کند.

در آرشیو .env، متغیرهای اتصال پایگاه داده خود را همانطور که در مثال زیر نشان داده شده است تعریف کنید:

DB_CONNECTION_METHOD=mysqli
DB_CONNECTION=mysql
DB_HOST=localhost
DB_NAME=lithe
DB_USERNAME=root
DB_PASSWORD=
DB_SHOULD_INITIATE=true

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

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

جزئیات متغیر

DB_CONNECTION_METHOD: روش اتصال (در این مورد، mysqli).

DB_CONNECTION: نوع پایگاه داده (به عنوان مثال mysql).

DB_HOST: آدرس سرور پایگاه داده (معمولا localhost برای توسعه محلی).

DB_NAME: نام پایگاه داده ای که استفاده می شود (به عنوان مثال، lithe).

DB_USERNAME: نام کاربری برای دسترسی به پایگاه داده (پیش فرض root برای بسیاری از تنظیمات محلی).

DB_PASSWORD: رمز عبور کاربر پایگاه داده (اگر وجود ندارد، آن را خالی بگذارید).

DB_SHOULD_INITIATE: تعیین می کند که آیا پایگاه داده باید به طور خودکار هنگام راه اندازی برنامه راه اندازی شود یا خیر.

پس از پیکربندی فایل .env، شما آماده هستید تا با ایجاد برنامه CRUD ادامه دهید.

با این متغیرها، Lithe به طور خودکار به پایگاه داده متصل می شود. این کار توسط فایل پیکربندی در انجام می شود src/database/config/database.php، که شامل روش زیر است:

use Lithe\Database\Manager as DB;

return DB::initialize();

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

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

این روش اتصال پایگاه داده را برمی گرداند که توسط ثابت استفاده می شود DB_CONNECTION.

ایجاد مهاجرت

پس از پیکربندی پایگاه داده، مرحله بعدی ایجاد ساختار پایگاه داده است. برای این کار از دستور استفاده می کنیم make:migration از Lithe. برای ایجاد یک مهاجرت دستور زیر را اجرا کنید:

php line make:migration CreateUsersTable

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

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

این یک فایل مهاجرت در دایرکتوری ایجاد می کند src/database/migrations/، با نام در قالب YYYY_MM_DD_HHMMSS_CreateUsersTable.php.

مهاجرت ایجاد شده دارای ساختار زیر خواهد بود:

return new class
{
/**
* Executa as migrações.
*
* @param mysqli $db
* @return void
*/
public function up(mysqli $db): void
{
$query = ”
CREATE TABLE IF NOT EXISTS users (
id INT(11) AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
“;
$db->query($query);
}

/**
* Reverte as migrações.
*
* @param mysqli $db
* @return void
*/
public function down(mysqli $db): void
{
$query = “DROP TABLE IF EXISTS users”;
$db->query($query);
}
};

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

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

پس از تعریف ساختار مهاجرت، دستور زیر را برای اعمال مهاجرت ها و ایجاد جدول در پایگاه داده اجرا کنید:

php line migrate

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

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

ایجاد یک مدل

برای تولید مدلی که با جدول تعامل دارد users، دستور زیر را اجرا کنید:

php line make:model User

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

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

با این کار یک فایل در آن ایجاد می شود src/models، که به عنوان پایه ای برای دستکاری داده های کاربر عمل می کند. مدل تولید شده به شکل زیر خواهد بود:

namespace App\Models;

class User
{
// Aqui vai a lógica do modelo
}

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

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

روش‌های CRUD غیرمدل

برای انجام عملیات CRUD با استفاده از روش های استاتیک اضافه کنید mysqli و ثابت DB_CONNECTION.

ایجاد کنید

برای وارد کردن یک کاربر جدید، این روش را اضافه کنید:

public static function create(array $data): bool
{
$stmt = DB_CONNECTION->prepare(“INSERT INTO users (name, email) VALUES (?, ?)”);
$stmt->bind_param(‘ss’, $data[‘name’], $data[’email’]);
return $stmt->execute();
}

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

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

بخوانید (لر)

برای جستجوی کاربران، روش های زیر را اجرا کنید:

public static function all(): array
{
return DB_CONNECTION->query(“SELECT * FROM users”)->fetch_all(MYSQLI_ASSOC);
}

public static function find(int $id): ?array
{
$stmt = DB_CONNECTION->prepare(“SELECT * FROM users WHERE id = ?”);
$stmt->bind_param(‘i’, $id);
$stmt->execute();
return $stmt->get_result()->fetch_assoc() ?: null;
}

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

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

به روز رسانی

برای به روز رسانی یک کاربر موجود:

public static function update(int $id, array $data): bool
{
$stmt = DB_CONNECTION->prepare(“UPDATE users SET name = ?, email = ? WHERE id = ?”);
$stmt->bind_param(‘ssi’, $data[‘name’], $data[’email’], $id);
return $stmt->execute();
}

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

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

حذف کنید

و برای حذف یک کاربر:

public static function delete(int $id): bool
{
$stmt = DB_CONNECTION->prepare(“DELETE FROM users WHERE id = ?”);
$stmt->bind_param(‘i’, $id);
return $stmt->execute();
}

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

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

درایورهای پایه

برای تولید سریع یک کنترلر جدید، دستور را اجرا کنید line make:controller. تمام کنترل کننده های تولید شده در دایرکتوری ذخیره می شوند src/http/controllers:

php line make:controller UserController

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

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

یک کنترلر می تواند هر تعداد روش عمومی داشته باشد که به درخواست های HTTP پاسخ دهد. نمونه ای از پیاده سازی پایه برای جدول را ببینید users:

namespace App\Http\Controllers;

use App\Models\User;
use Lithe\Http\Request;
use Lithe\Http\Response;

class UserController
{
/**
* Mostra o perfil de um usuário específico.
*/
public function show(Request $req, Response $res)
{
$id = $req->param(‘id’);

return $res->view(‘user.profile’, [
‘user’ => User::find($id)
]);
}

/**
* Cria um novo usuário.
*/
public function store(Request $req, Response $res)
{
$data = (array) $req->body(); // Obtém todos os dados do pedido
User::create($data);

return $res->redirect(‘/users’); // Redireciona para a lista de usuários
}

/**
* Atualiza um usuário existente.
*/
public function update(Request $req, Response $res)
{
$id = $req->param(‘id’);
$data = (array) $req->body(); // Obtém todos os dados do pedido
User::update($id, $data);

return $res->redirect(‘/users’); // Redireciona para a lista de usuários
}

/**
* Exclui um usuário.
*/
public function delete(Request $req, Response $res)
{
$id = $req->param(‘id’);
User::delete($id);

return $res->redirect(‘/users’); // Redireciona para a lista de usuários
}
}

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

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

افزودن نماها

برای نمایش اطلاعات کاربر، فایل های پیش نمایش را در دایرکتوری ایجاد کنید src/views. یک فایل مثال می تواند باشد user/profile.php، جایی که رابط نمایش داده های کاربر را خواهید ساخت.

شروع برنامه

برای شروع توسعه با Lithe، باید یک نمونه جدید از کلاس ایجاد کنید Lithe\App در فایل src/App.php و مسیرها را مشخص کنید.

$app = new \Lithe\App;

$app->get(‘/users/:id’, [UserController::class, ‘show’]);
$app->post(‘/users’, [UserController::class, ‘store’]);
$app->put(‘/users/:id’, [UserController::class, ‘update’]);
$app->delete(‘/users/:id’, [UserController::class, ‘delete’]);

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

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

اجرای برنامه

پس از تعیین مسیرها، فراخوانی متد ضروری است listen() برای راه اندازی سرور می توانید این کار را در همان فایل انجام دهید src/App.php:

$app->listen();

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

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

و برای اجرای برنامه از دستور زیر استفاده کنید:

php line serve

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

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

این یک سرور محلی را راه اندازی می کند که می توانید از آن دسترسی داشته باشید http://localhost:8000.

اکنون که برنامه CRUD شما پیکربندی و اجرا می شود، می توانید مستقیماً در مرورگر خود به مسیرهای کاربر دسترسی داشته باشید. برای مشاهده لیست کاربران یا تعامل با عملکردهایی که پیاده سازی کرده اید، به سادگی به:

http://localhost:8000/users

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

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

این مسیر به شما این امکان را می دهد که تمام کاربران ثبت نام شده را مشاهده کنید و عملیات هایی مانند ایجاد، به روز رسانی یا حذف رکوردها را با توجه به عملکردهایی که در کنترلرها پیاده سازی کرده اید انجام دهید.

البته! در اینجا بخش نتیجه گیری با مستندات Lithe شامل:

نتیجه گیری

با این مراحل، شما از قبل یک برنامه کاربردی CRUD با استفاده از PHP، MySQL و فریم ورک دارید روشن. اکنون، می توانید این پایه را گسترش دهید تا در صورت نیاز، ویژگی ها و عملکردهای بیشتری را اضافه کنید.

برای اطلاعات بیشتر در مورد نحوه استفاده از روشن، به مستندات رسمی Lithe مراجعه کنید. مستندات همه چیز را از راه‌اندازی اولیه گرفته تا ویژگی‌های پیشرفته را پوشش می‌دهد و به شما کمک می‌کند از پتانسیل چارچوب حداکثر استفاده را ببرید.

از برنامه نویسی لذت ببرید!

این راهنمای گام به گام به شما یاد می دهد که چگونه یک برنامه CRUD با استفاده از PHP، MySQL و چارچوب Lithe بسازید. ما همه چیز را از پیکربندی پایگاه داده گرفته تا اجرای کنترلرها برای مدیریت عملیات CRUD را پوشش خواهیم داد.


پیکربندی محیط

قبل از شروع، مطمئن شوید که Composer را روی دستگاه خود نصب کرده اید. Composer یک ابزار ضروری برای مدیریت وابستگی ها در پروژه های PHP است. اگر Composer ندارید، می توانید آن را از وب سایت رسمی Composer دانلود و نصب کنید.

ایجاد یک پروژه Lithe جدید

برای ایجاد یک پروژه جدید با چارچوب Lithe، ترمینال را باز کرده و دستور زیر را اجرا کنید:

composer create-project lithephp/lithephp crud-app
وارد حالت تمام صفحه شوید

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

با این کار یک دایرکتوری به نام ایجاد می شود crud-app، جایی که تمام فایل های پروژه Lithe نصب خواهند شد. پس از نصب، به دایرکتوری پروژه بروید:

cd crud-app
وارد حالت تمام صفحه شوید

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

پیکربندی پایگاه داده

اکنون باید اتصال پایگاه داده را پیکربندی کنید. فایل را پیدا کنید .env در ریشه پروژه این فایل متغیرهای محیطی را که Lithe هنگام اجرا از آنها استفاده خواهد کرد ذخیره می کند.

در آرشیو .env، متغیرهای اتصال پایگاه داده خود را همانطور که در مثال زیر نشان داده شده است تعریف کنید:

DB_CONNECTION_METHOD=mysqli
DB_CONNECTION=mysql
DB_HOST=localhost
DB_NAME=lithe
DB_USERNAME=root
DB_PASSWORD=
DB_SHOULD_INITIATE=true
وارد حالت تمام صفحه شوید

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

جزئیات متغیر

  • DB_CONNECTION_METHOD: روش اتصال (در این مورد، mysqli).
  • DB_CONNECTION: نوع پایگاه داده (به عنوان مثال mysql).
  • DB_HOST: آدرس سرور پایگاه داده (معمولا localhost برای توسعه محلی).
  • DB_NAME: نام پایگاه داده ای که استفاده می شود (به عنوان مثال، lithe).
  • DB_USERNAME: نام کاربری برای دسترسی به پایگاه داده (پیش فرض root برای بسیاری از تنظیمات محلی).
  • DB_PASSWORD: رمز عبور کاربر پایگاه داده (اگر وجود ندارد، آن را خالی بگذارید).
  • DB_SHOULD_INITIATE: تعیین می کند که آیا پایگاه داده باید به طور خودکار هنگام راه اندازی برنامه راه اندازی شود یا خیر.

پس از پیکربندی فایل .env، شما آماده هستید تا با ایجاد برنامه CRUD ادامه دهید.

با این متغیرها، Lithe به طور خودکار به پایگاه داده متصل می شود. این کار توسط فایل پیکربندی در انجام می شود src/database/config/database.php، که شامل روش زیر است:

use Lithe\Database\Manager as DB;

return DB::initialize();
وارد حالت تمام صفحه شوید

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

این روش اتصال پایگاه داده را برمی گرداند که توسط ثابت استفاده می شود DB_CONNECTION.


ایجاد مهاجرت

پس از پیکربندی پایگاه داده، مرحله بعدی ایجاد ساختار پایگاه داده است. برای این کار از دستور استفاده می کنیم make:migration از Lithe. برای ایجاد یک مهاجرت دستور زیر را اجرا کنید:

php line make:migration CreateUsersTable
وارد حالت تمام صفحه شوید

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

این یک فایل مهاجرت در دایرکتوری ایجاد می کند src/database/migrations/، با نام در قالب YYYY_MM_DD_HHMMSS_CreateUsersTable.php.

مهاجرت ایجاد شده دارای ساختار زیر خواهد بود:

return new class
{
    /**
     * Executa as migrações.
     *
     * @param mysqli $db
     * @return void
     */
    public function up(mysqli $db): void
    {
        $query = "
            CREATE TABLE IF NOT EXISTS users (
                id INT(11) AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(255) NOT NULL,
                email VARCHAR(255) UNIQUE NOT NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
        ";
        $db->query($query);
    }

    /**
     * Reverte as migrações.
     *
     * @param mysqli $db
     * @return void
     */
    public function down(mysqli $db): void
    {
        $query = "DROP TABLE IF EXISTS users";
        $db->query($query);
    }
};
وارد حالت تمام صفحه شوید

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

پس از تعریف ساختار مهاجرت، دستور زیر را برای اعمال مهاجرت ها و ایجاد جدول در پایگاه داده اجرا کنید:

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

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


ایجاد یک مدل

برای تولید مدلی که با جدول تعامل دارد users، دستور زیر را اجرا کنید:

php line make:model User
وارد حالت تمام صفحه شوید

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

با این کار یک فایل در آن ایجاد می شود src/models، که به عنوان پایه ای برای دستکاری داده های کاربر عمل می کند. مدل تولید شده به شکل زیر خواهد بود:

namespace App\Models;

class User
{
    // Aqui vai a lógica do modelo
}
وارد حالت تمام صفحه شوید

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

روش‌های CRUD غیرمدل

برای انجام عملیات CRUD با استفاده از روش های استاتیک اضافه کنید mysqli و ثابت DB_CONNECTION.

ایجاد کنید

برای وارد کردن یک کاربر جدید، این روش را اضافه کنید:

public static function create(array $data): bool
{
    $stmt = DB_CONNECTION->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $stmt->bind_param('ss', $data['name'], $data['email']);
    return $stmt->execute();
}
وارد حالت تمام صفحه شوید

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

بخوانید (لر)

برای جستجوی کاربران، روش های زیر را اجرا کنید:

public static function all(): array
{
    return DB_CONNECTION->query("SELECT * FROM users")->fetch_all(MYSQLI_ASSOC);
}

public static function find(int $id): ?array
{
    $stmt = DB_CONNECTION->prepare("SELECT * FROM users WHERE id = ?");
    $stmt->bind_param('i', $id);
    $stmt->execute();
    return $stmt->get_result()->fetch_assoc() ?: null;
}
وارد حالت تمام صفحه شوید

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

به روز رسانی

برای به روز رسانی یک کاربر موجود:

public static function update(int $id, array $data): bool
{
    $stmt = DB_CONNECTION->prepare("UPDATE users SET name = ?, email = ? WHERE id = ?");
    $stmt->bind_param('ssi', $data['name'], $data['email'], $id);
    return $stmt->execute();
}
وارد حالت تمام صفحه شوید

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

حذف کنید

و برای حذف یک کاربر:

public static function delete(int $id): bool
{
    $stmt = DB_CONNECTION->prepare("DELETE FROM users WHERE id = ?");
    $stmt->bind_param('i', $id);
    return $stmt->execute();
}
وارد حالت تمام صفحه شوید

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


درایورهای پایه

برای تولید سریع یک کنترلر جدید، دستور را اجرا کنید line make:controller. تمام کنترل کننده های تولید شده در دایرکتوری ذخیره می شوند src/http/controllers:

php line make:controller UserController
وارد حالت تمام صفحه شوید

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

یک کنترلر می تواند هر تعداد روش عمومی داشته باشد که به درخواست های HTTP پاسخ دهد. نمونه ای از پیاده سازی پایه برای جدول را ببینید users:

namespace App\Http\Controllers;

use App\Models\User;
use Lithe\Http\Request;
use Lithe\Http\Response;

class UserController
{
    /**
     * Mostra o perfil de um usuário específico.
     */
    public function show(Request $req, Response $res)
    {
        $id = $req->param('id');

        return $res->view('user.profile', [
            'user' => User::find($id)
        ]);
    }

    /**
     * Cria um novo usuário.
     */
    public function store(Request $req, Response $res)
    {
        $data = (array) $req->body(); // Obtém todos os dados do pedido
        User::create($data);

        return $res->redirect('/users'); // Redireciona para a lista de usuários
    }

    /**
     * Atualiza um usuário existente.
     */
    public function update(Request $req, Response $res)
    {
        $id = $req->param('id');
        $data = (array) $req->body(); // Obtém todos os dados do pedido
        User::update($id, $data);

        return $res->redirect('/users'); // Redireciona para a lista de usuários
    }

    /**
     * Exclui um usuário.
     */
    public function delete(Request $req, Response $res)
    {
        $id = $req->param('id');
        User::delete($id);

        return $res->redirect('/users'); // Redireciona para a lista de usuários
    }
}
وارد حالت تمام صفحه شوید

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


افزودن نماها

برای نمایش اطلاعات کاربر، فایل های پیش نمایش را در دایرکتوری ایجاد کنید src/views. یک فایل مثال می تواند باشد user/profile.php، جایی که رابط نمایش داده های کاربر را خواهید ساخت.


شروع برنامه

برای شروع توسعه با Lithe، باید یک نمونه جدید از کلاس ایجاد کنید Lithe\App در فایل src/App.php و مسیرها را مشخص کنید.

$app = new \Lithe\App;

$app->get('/users/:id', [UserController::class, 'show']);
$app->post('/users', [UserController::class, 'store']);
$app->put('/users/:id', [UserController::class, 'update']);
$app->delete('/users/:id', [UserController::class, 'delete']);
وارد حالت تمام صفحه شوید

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

اجرای برنامه

پس از تعیین مسیرها، فراخوانی متد ضروری است listen() برای راه اندازی سرور می توانید این کار را در همان فایل انجام دهید src/App.php:

$app->listen();
وارد حالت تمام صفحه شوید

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

و برای اجرای برنامه از دستور زیر استفاده کنید:

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

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

این یک سرور محلی را راه اندازی می کند که می توانید از آن دسترسی داشته باشید http://localhost:8000.

اکنون که برنامه CRUD شما پیکربندی و اجرا می شود، می توانید مستقیماً در مرورگر خود به مسیرهای کاربر دسترسی داشته باشید. برای مشاهده لیست کاربران یا تعامل با عملکردهایی که پیاده سازی کرده اید، به سادگی به:

http://localhost:8000/users
وارد حالت تمام صفحه شوید

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

این مسیر به شما این امکان را می دهد که تمام کاربران ثبت نام شده را مشاهده کنید و عملیات هایی مانند ایجاد، به روز رسانی یا حذف رکوردها را با توجه به عملکردهایی که در کنترلرها پیاده سازی کرده اید انجام دهید.


البته! در اینجا بخش نتیجه گیری با مستندات Lithe شامل:


نتیجه گیری

با این مراحل، شما از قبل یک برنامه کاربردی CRUD با استفاده از PHP، MySQL و فریم ورک دارید روشن. اکنون، می توانید این پایه را گسترش دهید تا در صورت نیاز، ویژگی ها و عملکردهای بیشتری را اضافه کنید.

برای اطلاعات بیشتر در مورد نحوه استفاده از روشن، به مستندات رسمی Lithe مراجعه کنید. مستندات همه چیز را از راه‌اندازی اولیه گرفته تا ویژگی‌های پیشرفته را پوشش می‌دهد و به شما کمک می‌کند از پتانسیل چارچوب حداکثر استفاده را ببرید.

از برنامه نویسی لذت ببرید!

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

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

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

دکمه بازگشت به بالا