Turso + Doctrine DBAL
PHP + Doctrine DBAL 프로젝트에 Turso를 붙이는 일은 몇 분이면 끝나요. 이 가이드는 자격 증명 설정부터 Composer 설치, 연결 구성, 그리고 실제로 동작하는 Todo CLI 예제까지 안내해요.
출처: 문서
본문
시작 전 준비물
시작하기 전에 다음을 확인해 주세요.
- Turso CLI 설치
- Turso 가입 또는 로그인
- Doctrine DBAL을 갖춘 PHP 애플리케이션 준비
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)
- PHP Todo CLI + Doctrine DBAL — github.com/tursodatabase/example/php-todo-cli-doctrine-dbal에서 전체 소스 코드를 볼 수 있어요.
- Symfony Rest API CRUD — github.com/tursodatabase/example/symfony7-rest-api-crud에서 전체 소스 코드를 볼 수 있어요.
더 알아보기 (Learn more)
- PHP 퀵스타트 — PHP용 libSQL 클라이언트 기본 사용법
- Laravel 연동 가이드 — Eloquent와 함께 Turso 쓰기
- PHP 레퍼런스 — PHP 클라이언트 API 전체 정리
- Turso CLI 설치 — Turso CLI 설치 절차