Створений щоб помирати
165 subscribers
29 photos
9 videos
43 links
Канал про PHP, розробку, проєктування і нескінченне навчання в циклі життя.
Download Telegram
#️⃣ #php #doctrine #enum #4students #tips #tools

🧩 Doctrine +
Enum
Я так люблю enum’и, що зробив навіть власний пакет — ufo-tech/doctrine-helper, який навчає Doctrine розуміти enum у типізованих полях сутності і створювати під них ENUM() тип поля в MySQL.

1️⃣ Створи свій PHP Enum для поля сутності
<?php
namespace App;

enum MyEnum: string
{
case CASE_1 = 'Мій варіант 1';
case CASE_2 = 'Мій варіант 2';
}


2️⃣ Створи власний DBAL-тип і наслідуй Ufo\DoctrineHelper\DBAL\AbstractEnumType
<?php
namespace App\DBAL;

use BackedEnum;
use App\MyEnum;

class MyEnumType extends AbstractEnumType
{
protected string|BackedEnum $enum = MyEnum::class;
}


3️⃣ Зареєструй новий тип у Doctrine
doctrine:
dbal:
types:
App\MyEnum: 'App\DBAL\MyEnumType'
mapping_types:
enum: string


4️⃣ Використовуй PHP Enum для зберігання й зміни значення
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use App\MyEnum;

#[ORM\Entity]
#[ORM\Table(name: 'demo')]
class Demo
{
#[ORM\Column(type: MyEnum::class, nullable: false)]
protected string $case;

public function __construct(MyEnum $case)
{
$this->case = $case->value;
}

public function changeCase(MyEnum $case): void
{
$this->case = $case->value;
}

public function getCase(): string
{
return $this->case;
}
}


💡 Таким чином MySQL ENUM поводиться як повноцінний PHP Enum — із типобезпекою, автопідказками IDE та без ручного кастингу.
👍3❤1