Files
clinicpro/docs/tasks/task-01-project-setup/database.md
T
hamed de1a78a235 feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- Add SendSmsMessage class for encapsulating SMS message data.
- Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS.
- Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates.
- Develop SendSmsHandler for handling SMS sending messages.
- Create SmsService to manage SMS dispatching and logging.
- Add UserProfileController for managing user profiles with CRUD operations.
- Implement UserProfile entity and repository for user profile data management.
- Update symfony.lock and bootstrap.php for project dependencies and environment setup.
2026-06-09 22:00:34 +03:30

2.7 KiB

پایگاه داده — تسک ۰۱: راه‌اندازی پروژه

موتور پایگاه داده

MySQL 8.0 با موتور InnoDB و charset از نوع utf8mb4. DDEV به صورت پیش‌فرض MySQL 8 را فراهم می‌کند.

قراردادهای کلی

قرارداد توضیح
id کلید اصلی auto-increment (فقط استفاده داخلی)
uuid شناسه عمومی UUID v4 (استفاده در API)
created_at زمان ایجاد (datetime_immutable)
updated_at زمان آخرین ویرایش (datetime_immutable)
deleted_at nullable — برای soft delete جداول مهم
Foreign key ON DELETE CASCADE یا ON DELETE SET NULL بسته به نیاز

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

DDEV به طور خودکار MySQL 8 راه‌اندازی می‌کند:

# اطلاعات اتصال از DDEV
DB_HOST=db
DB_PORT=3306
DB_NAME=db
DB_USER=db
DB_PASSWORD=db

در فایل .env:

DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=8.0&charset=utf8mb4"

Redis با DDEV

# .ddev/docker-compose.redis.yaml
version: "3.6"
services:
  redis:
    image: redis:7-alpine
    expose:
      - "6379"
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: ${DDEV_APPROOT}

استفاده از Redis

کاربرد کلید TTL
کد OTP otp:{mobile} ۱۲۰ ثانیه
Rate limiting rate:{ip}:{endpoint} بسته به قانون
JWT Blacklist (logout) jwt_blacklist:{jti} تا انقضای token

TimestampableTrait

در همه Entity ها استفاده می‌شود:

// src/Shared/Trait/TimestampableTrait.php
trait TimestampableTrait
{
    #[ORM\Column(type: 'datetime_immutable')]
    private \DateTimeImmutable $createdAt;

    #[ORM\Column(type: 'datetime_immutable')]
    private \DateTimeImmutable $updatedAt;

    #[ORM\PrePersist]
    public function onPrePersist(): void
    {
        $this->createdAt = new \DateTimeImmutable();
        $this->updatedAt = new \DateTimeImmutable();
    }

    #[ORM\PreUpdate]
    public function onPreUpdate(): void
    {
        $this->updatedAt = new \DateTimeImmutable();
    }
}

استراتژی Migration

  • از doctrine/doctrine-migrations-bundle استفاده می‌شود
  • هر تسک migration فایل مخصوص خود را دارد
  • هرگز migration های قبلی ویرایش نشوند — همیشه فایل جدید بساز
  • دستور اجرا:
ddev exec php bin/console doctrine:migrations:migrate
  • دستور ساخت migration جدید:
ddev exec php bin/console doctrine:migrations:diff