PHP

CycleORM + DDD example

Давайте создадим простой пример, чтобы продемонстрировать, как можно использовать Cycle ORM в контексте DDD. Мы определим доменную сущность User и репозиторий для работы с этой сущностью. Затем мы выполним базовую операцию добавления пользователя в базу данных.

Шаг 1: Установка Cycle ORM

Первым делом необходимо установить Cycle ORM и необходимые компоненты через Composer:

composer require cycle/orm
composer require cycle/database
composer require cycle/annotated
composer require cycle/proxy-factory
composer require cycle/migrations

Шаг 2: Конфигурация Cycle ORM

Для простоты примера мы создадим минимальную конфигурацию Cycle ORM. В реальном проекте вам потребуется более сложная конфигурация.

use Cycle\ORM\Factory;
use Cycle\ORM\ORM;
use Cycle\ORM\Schema;
use Cycle\Database\Config\DatabaseConfig;
use Cycle\Database\DatabaseManager;

// Настройка соединения с базой данных
$dbal = new DatabaseManager(new DatabaseConfig([
    'default' => 'default',
    'databases' => [
        'default' => ['connection' => 'sqlite']
    ],
    'connections' => [
        'sqlite' => [
            'driver' => \Cycle\Database\Driver\SQLite\SQLiteDriver::class,
            'connection' => 'sqlite::memory:',
            'username' => '',
            'password' => '',
        ],
    ],
]));

// Создание ORM фабрики и самого ORM
$orm = new ORM(new Factory($dbal));

Шаг 3: Определение сущности

Определим простую сущность User с помощью аннотаций:

declare(strict_types=1);

use Cycle\Annotated\Annotation\Entity;
use Cycle\Annotated\Annotation\Column;

/**
 * @Entity
 */
class User
{
    public function __construct(
        /** @Column(type="primary") */
        public int $id,

        /** @Column(type="string") */
        public string $name,

        /** @Column(type="string") */
        public string $email
    ) {}
}

Шаг 4: Работа с сущностью через репозиторий

Теперь определим простой репозиторий для работы с пользователем: 

use Cycle\ORM\ORM;
use Cycle\ORM\Transaction;

class UserRepository
{
    public function __construct(private ORM $orm)
    {
    }

    public function addUser(User $user): void
    {
        $transaction = new Transaction($this->orm);
        $transaction->persist($user);
        $transaction->run();
    }

    public function getUser(int $id): ?User
    {
        $repository = $this->orm->getRepository(User::class);
        return $repository->findByPK($id);
    }
}

Шаг 5: Использование репозитория

Теперь мы можем использовать репозиторий для добавления и получения пользователей:

$userRepository = new UserRepository($orm);

$user = new User('John Doe', 'john.doe@example.com');
$userRepository->addUser($user);

$retrievedUser = $userRepository->getUser($user->id);
echo $retrievedUser->name; // Выведет "John Doe"

Этот пример иллюстрирует базовую настройку и использование Cycle ORM для реализации DDD концепций. В реальном приложении потребуется более сложная конфигурация, включая миграции, более сложные сущности и репозитории, а также обработку зависимостей.

 

Sources:

https://cycle-orm.dev/docs/annotated-entity/current/en

Афоризм дня:
Мы учимся, увы, для школы, а не для жизни. (520)

Leave a reply

Яндекс.Метрика