본문 바로가기
WIKI 기술 지식 베이스

Turso + Doctrine DBAL

원문 보기 위키 갱신

PHP + Doctrine DBAL 프로젝트에 Turso를 붙이는 일은 몇 분이면 끝나요. 이 가이드는 자격 증명 설정부터 Composer 설치, 연결 구성, 그리고 실제로 동작하는 Todo CLI 예제까지 안내해요.

출처: 문서

본문

시작 전 준비물

시작하기 전에 다음을 확인해 주세요.

PHP에서 libSQL 익스텐션(libsql-ext-php)을 설치해 두면 좋아요. 터미널에서 pecl install libsql-ext-php 명령으로 설치할 수 있어요.

단계별 진행

1. 데이터베이스 자격 증명 설정

데이터베이스 URL을 확인해요.

turso db show --url <database-name>

데이터베이스 인증 토큰을 만들어요.

turso db tokens create <database-name>

자격 증명을 .env 안의 환경 변수에 할당해요.

TURSO_DATABASE_URL=
TURSO_AUTH_TOKEN=

참고: 나중에 Remote와 Embedded Replica 구성에서 연결할 때 필요하니 잘 보관해 두세요.

2. PHP 프로젝트 만들기

새 디렉터리를 만들어요.

mkdir your-awesome-php-project
cd your-awesome-php-project

3. Turso Doctrine DBAL 설치

composer require tursodatabase/turso-doctrine-dbal

4. 데이터베이스 연결 설정

필요한 연결 유형을 골라 환경 설정을 구성해요.

$params = [
    "url"               => ":memory:",
    'driverClass'       => \Turso\Doctrine\DBAL\Driver::class,
];
$params = [
    "url"               => "database.db",
    'driverClass'       => \Turso\Doctrine\DBAL\Driver::class,
];
$params = [
    "auth_token"        => getenv('TURSO_AUTH_TOKEN'),
    "sync_url"          => getenv('TURSO_DATABASE_URL'),
    'driverClass'       => \Turso\Doctrine\DBAL\Driver::class,
];
$params = [
    "url"               => "database.db",
    "auth_token"        => getenv('TURSO_AUTH_TOKEN'),
    "sync_url"          => getenv('TURSO_DATABASE_URL'),
    'driverClass'       => \Turso\Doctrine\DBAL\Driver::class,
];

기타 환경 변수 (Embedded Replica 전용)

  • sync_interval (integer): 동기화 간격을 초 단위로 나타내는 정수 (선택, 기본값: 5).
  • read_your_writes (boolean): 자신이 쓴 내용을 읽을지 여부 (선택, 기본값: true).
  • encryption_key (string): 암호화용 문자열 값 (선택, 기본값: 빈 값).

5. 프로젝트 구조 예시

src/
├── helpers.php
└── Todo.php
vendor/
composer.json
composer.lock
todo            # todo executable

여기서는 간단한 PHP Todo CLI + Doctrine DBAL 예제를 보여줘요.

#!/usr/bin/env php
<?php

use Turso\Todo\CLI\Todo;

require_once __DIR__ . '/vendor/autoload.php';

$header = 'TODO CLI + TURSO';

echo $header . PHP_EOL;
function main()
{
    echo str_repeat('-', WIDTH - 18) . "  Todo CLI - " . VERSION . PHP_EOL;

    while (true) {
        echo "[L] List | [A] Add | [E] Edit | [D] Delete | [X] Exit" . PHP_EOL;
        echo "command: ";

        $choice = trim(fgets(STDIN));

        $app = new Todo();

        switch (strtolower($choice)) {
            case 'l':
                $app->listTodos();
                break;
            case 'a':
                $app->addTodo();
                clearScreen();
                break;
            case 'e':
                $app->editTodo();
                clearScreen();
                break;
            case 'd':
                $app->deleteTodo();
                clearScreen();
                break;
            case 'x':
                exit("Goodbye!" . PHP_EOL);
            default:
                echo "Invalid choice." . PHP_EOL;
                clearScreen();
        }
    }

    echo PHP_EOL;
}

main();
<?php

use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DriverManager;

const WIDTH = 100;
const VERSION = '1.0.0';

function clearScreen()
{
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        system('cls');
    } else {
        system('clear');
    }
}

function createConnection(): Connection
{
    $params = [
        "auth_token"        => getenv('TURSO_AUTH_TOKEN'),
        "sync_url"          => getenv('TURSO_DATABASE_URL'),
        'driverClass'       => \Turso\Doctrine\DBAL\Driver::class,
    ];

    $db = DriverManager::getConnection($params);
    
    return $db;
}
<?php

namespace Turso\Todo\CLI;

use Doctrine\DBAL\Connection;

class Todo
{

    private Connection $db;

    public function __construct()
    {
        $this->db = createConnection();
    }

    public function loadTodos(): array
    {
        $sql = "SELECT * FROM todos";
        return $this->db->fetchAllAssociative($sql);
    }

    public function saveTodo(string $todo): void
    {
        $sql = "INSERT INTO todos (name) VALUES (?)";
        $this->db->executeStatement($sql, [$todo]);
    }

    public function updateTodo(int $id, string $todo): void
    {
        $sql = "UPDATE todos SET name = ? WHERE id = ?";
        $this->db->executeStatement($sql, [$todo, $id]);
    }

    public function removeTodo(int $id): void
    {
        $sql = "DELETE FROM todos WHERE id = ?";
        $this->db->executeStatement($sql, [$id]);
    }

    public function listTodos()
    {
        $todos = $this->loadTodos();
        echo "\n" . "TODO-List   " . str_repeat('-', WIDTH - 12) . "\n\n";
        if (!empty($todos)) {
            foreach ($todos as $todo) {
                echo sprintf("[%d] %s\n", $todo['id'], $todo['name']);
            }
        } else {
            echo "Nothing...\n";
        }
        echo "\n" . str_repeat('-', WIDTH) . "\n";
    }

    public function addTodo()
    {
        echo "Enter the new To-Do: ";
        $todo = trim(fgets(STDIN));
        $this->saveTodo($todo);
        echo "To-Do added.\n";
    }

    public function editTodo()
    {
        $this->listTodos();
        echo "Enter the number of the To-Do to edit: ";
        $index = intval(trim(fgets(STDIN)));

        $findTodo = $this->db->executeQuery("SELECT * FROM todos WHERE id = ?", [$index])->fetchAssociative();

        if (!empty($findTodo)) {
            echo "Enter the new value: ";
            $todo = trim(fgets(STDIN));
            $this->updateTodo($findTodo['id'], $todo);
            echo "To-Do updated.\n";
        } else {
            echo "Invalid index.\n";
        }
    }

    public function deleteTodo()
    {
        $this->listTodos();
        echo "Enter the number of the To-Do to delete: ";
        $index = intval(trim(fgets(STDIN)));
        $findTodo = $this->db->executeQuery("SELECT * FROM todos WHERE id = ?", [$index])->fetchAssociative();
        if (!empty($findTodo)) {
            $this->removeTodo($findTodo['id']);
            echo "To-Do deleted.\n";
        } else {
            echo "Invalid index.\n";
        }
    }
}

6. PHP 애플리케이션 준비 완료!

이제 PHP Todo CLI가 Turso와 함께 동작해요. 직접 실행해서 Todo를 추가하고 목록을 확인해 보세요.

예제 (Examples)

더 알아보기 (Learn more)