PHP와 Lithe Framework를 사용하여 TodoList 만들기: 전체 가이드

Patricia Arquette
풀어 주다: 2024-11-20 21:22:18
원래의
695명이 탐색했습니다.

Criando uma TodoList com PHP e o Framework Lithe: Um Guia Completo

이 튜토리얼에서는 Lithe를 사용하여 작동하는 TodoList 애플리케이션을 만듭니다. 프로젝트를 구성하고, 대화형 보기를 만들고, RESTful API를 구현하여 작업을 관리하는 방법을 배우게 됩니다. 이 프로젝트는 PHP를 사용하여 현대적인 웹 애플리케이션을 구축하는 방법에 대한 훌륭한 예가 될 것입니다.

전제 조건

  • PHP 7.4 이상
  • 컴포저 설치
  • MySQL
  • PHP 및 JavaScript에 대한 기본 지식

프로젝트 구조

먼저 새로운 Lithe 프로젝트를 만들어 보겠습니다.

composer create-project lithephp/lithephp todo-app
cd todo-app
로그인 후 복사

데이터베이스 구성

다음 설정으로 프로젝트 루트의 .env 파일을 편집합니다.

DB_CONNECTION_METHOD=mysqli
DB_CONNECTION=mysql
DB_HOST=localhost
DB_NAME=lithe_todos
DB_USERNAME=root
DB_PASSWORD=
DB_SHOULD_INITIATE=true
로그인 후 복사

마이그레이션 만들기

새 마이그레이션을 생성하려면 다음 명령을 실행하세요.

php line make:migration CreateTodosTable
로그인 후 복사

src/database/migrations/:
에서 생성된 마이그레이션 파일을 편집합니다.

return new class
{
    public function up(mysqli $db): void
    {
        $query = "
            CREATE TABLE IF NOT EXISTS todos (
                id INT(11) AUTO_INCREMENT PRIMARY KEY,
                title VARCHAR(255) NOT NULL,
                completed BOOLEAN DEFAULT FALSE,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
            )
        ";
        $db->query($query);
    }

    public function down(mysqli $db): void
    {
        $query = "DROP TABLE IF EXISTS todos";
        $db->query($query);
    }
};
로그인 후 복사

마이그레이션 실행:

php line migrate
로그인 후 복사

모델 구현

새 모델 생성:

php line make:model Todo
로그인 후 복사

src/models/Todo.php 파일을 편집하세요:

namespace App\Models;

use Lithe\Database\Manager as DB;

class Todo
{
    public static function all(): array
    {
        return DB::connection()
            ->query("SELECT * FROM todos ORDER BY created_at DESC")
            ->fetch_all(MYSQLI_ASSOC);
    }

    public static function create(array $data): ?array
    {
        $stmt = DB::connection()->prepare(
            "INSERT INTO todos (title, completed) VALUES (?, ?)"
        );
        $completed = false;
        $stmt->bind_param('si', $data['title'], $completed);
        $success = $stmt->execute();

        if ($success) {
            $id = $stmt->insert_id;
            return [
                'id' => $id,
                'title' => $data['title'],
                'completed' => $completed
            ];
        }

        return null;
    }

    public static function update(int $id, array $data): bool
    {
        $stmt = DB::connection()->prepare(
            "UPDATE todos SET completed = ? WHERE id = ?"
        );
        $stmt->bind_param('ii', $data['completed'], $id);
        return $stmt->execute();
    }

    public static function delete(int $id): bool
    {
        $stmt = DB::connection()->prepare("DELETE FROM todos WHERE id = ?");
        $stmt->bind_param('i', $id);
        return $stmt->execute();
    }
}
로그인 후 복사

컨트롤러 생성

새 컨트롤러 생성:

php line make:controller TodoController
로그인 후 복사

src/http/controllers/TodoController.php 파일을 편집하세요.

namespace App\Http\Controllers;

use App\Models\Todo;
use Lithe\Http\Request;
use Lithe\Http\Response;

class TodoController
{
    public static function index(Request $req, Response $res)
    {
        return $res->view('todo.index');
    }

    public static function list(Request $req, Response $res)
    {
        $todos = Todo::all();
        return $res->json($todos);
    }

    public static function store(Request $req, Response $res)
    {
        $data = (array) $req->body();
        $todo = Todo::create($data);
        $success = $todo ? true : false;

        return $res->json([
            'success' => $success,
            'message' => $success ? 'Tarefa criada com sucesso' : 'Falha ao criar tarefa',
            'todo' => $todo
        ]);
    }

    public static function update(Request $req, Response $res)
    {
        $id = $req->param('id');
        $data = (array) $req->body();
        $success = Todo::update($id, $data);

        return $res->json([
            'success' => $success,
            'message' => $success ? 'Tarefa atualizada com sucesso' : 'Falha ao atualizar tarefa'
        ]);
    }

    public static function delete(Request $req, Response $res)
    {
        $id = $req->param('id');
        $success = Todo::delete($id);

        return $res->json([
            'success' => $success,
            'message' => $success ? 'Tarefa removida com sucesso' : 'Falha ao remover tarefa'
        ]);
    }
}
로그인 후 복사

뷰 생성

src/views/todo 디렉토리를 생성하고 index.php 파일을 추가하세요.

<!DOCTYPE html>
<html>
<head>
    <title>TodoList com Lithe</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
        }

        body {
            min-height: 100vh;
            background-color: #ffffff;
            padding: 20px;
        }

        .container {
            max-width: 680px;
            margin: 0 auto;
            padding: 40px 20px;
        }

        h1 {
            color: #1d1d1f;
            font-size: 34px;
            font-weight: 700;
            margin-bottom: 30px;
        }

        .todo-form {
            display: flex;
            gap: 12px;
            margin-bottom: 30px;
            border-bottom: 1px solid #e5e5e7;
            padding-bottom: 30px;
        }

        .todo-input {
            flex: 1;
            padding: 12px 16px;
            font-size: 17px;
            border: 1px solid #e5e5e7;
            border-radius: 10px;
            background-color: #f5f5f7;
            transition: all 0.2s;
        }

        .todo-input:focus {
            outline: none;
            background-color: #ffffff;
            border-color: #0071e3;
        }

        .add-button {
            padding: 12px 20px;
            background: #0071e3;
            color: white;
            border: none;
            border-radius: 10px;
            font-size: 15px;
            font-weight: 500;
            cursor: pointer;
            transition: all 0.2s;
        }

        .add-button:hover {
            background: #0077ED;
        }

        .todo-list {
            list-style: none;
        }

        .todo-item {
            display: flex;
            align-items: center;
            padding: 16px;
            border-radius: 10px;
            margin-bottom: 8px;
            transition: background-color 0.2s;
        }

        .todo-item:hover {
            background-color: #f5f5f7;
        }

        .todo-checkbox {
            width: 22px;
            height: 22px;
            margin-right: 15px;
            cursor: pointer;
        }

        .todo-text {
            flex: 1;
            font-size: 17px;
            color: #1d1d1f;
        }

        .completed {
            color: #86868b;
            text-decoration: line-through;
        }

        .delete-button {
            padding: 8px 12px;
            background: none;
            color: #86868b;
            border: none;
            border-radius: 6px;
            font-size: 15px;
            cursor: pointer;
            opacity: 0;
            transition: all 0.2s;
        }

        .todo-item:hover .delete-button {
            opacity: 1;
        }

        .delete-button:hover {
            background: #f5f5f7;
            color: #ff3b30;
        }

        .loading {
            text-align: center;
            padding: 20px;
            color: #86868b;
        }

        .error {
            color: #ff3b30;
            text-align: center;
            padding: 20px;
        }
    </style>
</head>
<body>
    <div>



<h2>
  
  
  Configurando as Rotas
</h2>

<p>Atualize o arquivo src/App.php para incluir as rotas da TodoList:<br>
</p>

<pre class="brush:php;toolbar:false">use App\Http\Controllers\TodoController;

$app = new \Lithe\App;

// Rota para a página principal
$app->get('/', [TodoController::class, 'index']);

// Rotas da API
$app->get('/todos/list', [TodoController::class, 'list']);
$app->post('/todos', [TodoController::class, 'store']);
$app->put('/todos/:id', [TodoController::class, 'update']);
$app->delete('/todos/:id', [TodoController::class, 'delete']);

$app->listen();
로그인 후 복사

애플리케이션 실행

개발 서버를 시작하려면 다음을 실행하세요.

php line serve
로그인 후 복사

브라우저에서 http://localhost:8000으로 접속하시면 애플리케이션이 작동되는 모습을 보실 수 있습니다.

구현된 기능

저희 TodoList에는 다음과 같은 기능이 있습니다.

  1. 시간 역순으로 정리된 할 일 목록
  2. 새로운 작업 추가
  3. 작업을 완료/보류 중으로 표시
  4. 작업 제거
  5. 반응형 및 사용자 친화적인 인터페이스
  6. 모든 작업에 대한 시각적 피드백
  7. 오류 처리

결론

이제 Lithe로 구축된 완전한 기능의 TodoList 애플리케이션이 생겼습니다. 이 예에서는 다음을 포함하여 PHP를 사용하여 최신 웹 애플리케이션을 만드는 방법을 보여줍니다.

  • 올바른 MVC 코드 구조
  • RESTful API 구현
  • 대화형 사용자 인터페이스
  • 데이터베이스 통합
  • 오류 처리
  • 사용자 피드백

여기에서 다음과 같은 새로운 기능을 추가하여 애플리케이션을 확장할 수 있습니다.

  • 사용자 인증
  • 작업 분류
  • 유효기간
  • 필터 및 검색

Lithe에 대해 계속 알아보려면 Linktree로 이동하여 Discord, 문서 등에 액세스할 수 있습니다!

위 내용은 PHP와 Lithe Framework를 사용하여 TodoList 만들기: 전체 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿