# Erste Schritte

Diese Anleitung führt Sie durch die ersten Schritte mit dem Framework, nachdem Sie es [installiert](installation.md) und [konfiguriert](configuration.md) haben.

## Projektstruktur

Zunächst sollten Sie sich mit der Projektstruktur vertraut machen:

```
my-project/
├── bin/                  # Ausführbare Skripte
├── config/               # Konfigurationsdateien
├── docs/                 # Dokumentation
├── public/               # Öffentlich zugängliche Dateien
│   ├── index.php         # Einstiegspunkt für die Anwendung
│   ├── assets/           # Kompilierte Assets (CSS, JS)
│   └── uploads/          # Hochgeladene Dateien
├── resources/            # Quellressourcen
│   ├── css/              # CSS-Dateien
│   ├── js/               # JavaScript-Dateien
│   └── views/            # Template-Dateien
├── src/                  # PHP-Quellcode
│   ├── Application/      # Anwendungsspezifischer Code
│   │   ├── Controllers/  # Controller
│   │   ├── Models/       # Modelle
│   │   └── Services/     # Services
│   └── Framework/        # Framework-Code
│       ├── Core/         # Kernkomponenten
│       ├── Database/     # Datenbankabstraktion
│       └── Http/         # HTTP-Komponenten
├── storage/              # Speicher für Anwendungsdaten
│   ├── cache/            # Cache-Dateien
│   ├── logs/             # Log-Dateien
│   └── uploads/          # Hochgeladene Dateien
├── tests/                # Testdateien
├── vendor/               # Composer-Abhängigkeiten
├── .env                  # Umgebungsvariablen
├── composer.json         # Composer-Konfiguration
├── console.php           # Kommandozeilen-Interface
└── README.md             # Projektdokumentation
```

## Erstellen einer einfachen Seite

Lassen Sie uns eine einfache Seite erstellen, um zu sehen, wie das Framework funktioniert.

### 1. Erstellen eines Controllers

Erstellen Sie eine neue Datei `src/Application/Controllers/WelcomeController.php`:

```php
<?php

namespace App\Application\Controllers;

use App\Framework\Http\Controller;
use App\Framework\Http\Request;
use App\Framework\Http\Response;

class WelcomeController extends Controller
{
    public function index(Request $request): Response
    {
        return $this->view('welcome', [
            'title' => 'Willkommen',
            'message' => 'Willkommen beim Framework!',
        ]);
    }
}
```

### 2. Erstellen einer View

Erstellen Sie eine neue Datei `resources/views/welcome.php`:

```php
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><?= $title ?></title>
    <link rel="stylesheet" href="/assets/css/app.css">
</head>
<body>
    <div class="container">
        <h1><?= $title ?></h1>
        <p><?= $message ?></p>
    </div>
    <script src="/assets/js/app.js"></script>
</body>
</html>
```

### 3. Definieren einer Route

Öffnen Sie die Datei `config/routes.php` und fügen Sie eine neue Route hinzu:

```php
<?php

use App\Application\Controllers\WelcomeController;
use App\Framework\Routing\Router;

return function (Router $router) {
    $router->get('/', [WelcomeController::class, 'index']);
};
```

### 4. Testen der Anwendung

Starten Sie den eingebauten Entwicklungsserver:

```bash
php console.php serve
```

Öffnen Sie dann Ihren Browser und navigieren Sie zu `http://localhost:8000`. Sie sollten Ihre neue Seite sehen.

## Erstellen einer API-Endpunkt

Lassen Sie uns einen einfachen API-Endpunkt erstellen.

### 1. Erstellen eines API-Controllers

Erstellen Sie eine neue Datei `src/Application/Controllers/Api/UserController.php`:

```php
<?php

namespace App\Application\Controllers\Api;

use App\Framework\Http\Controller;
use App\Framework\Http\Request;
use App\Framework\Http\Response;

class UserController extends Controller
{
    public function index(Request $request): Response
    {
        $users = [
            ['id' => 1, 'name' => 'Max Mustermann'],
            ['id' => 2, 'name' => 'Erika Musterfrau'],
        ];

        return $this->json($users);
    }

    public function show(Request $request, int $id): Response
    {
        $users = [
            1 => ['id' => 1, 'name' => 'Max Mustermann'],
            2 => ['id' => 2, 'name' => 'Erika Musterfrau'],
        ];

        if (!isset($users[$id])) {
            return $this->json(['error' => 'Benutzer nicht gefunden'], 404);
        }

        return $this->json($users[$id]);
    }
}
```

### 2. Definieren von API-Routen

Fügen Sie in der Datei `config/routes.php` die folgenden Routen hinzu:

```php
$router->group('/api', function (Router $router) {
    $router->get('/users', [UserController::class, 'index']);
    $router->get('/users/{id}', [UserController::class, 'show']);
});
```

Vergessen Sie nicht, den Controller zu importieren:

```php
use App\Application\Controllers\Api\UserController;
```

### 3. Testen der API

Starten Sie den Entwicklungsserver und testen Sie die API mit einem HTTP-Client wie curl:

```bash
curl http://localhost:8000/api/users
curl http://localhost:8000/api/users/1
```

## Arbeiten mit der Datenbank

Das Framework bietet eine einfache Datenbankabstraktion. Hier ist ein Beispiel für die Arbeit mit der Datenbank:

### 1. Erstellen eines Modells

Erstellen Sie eine neue Datei `src/Application/Models/User.php`:

```php
<?php

namespace App\Application\Models;

use App\Framework\Database\Model;

class User extends Model
{
    protected string $table = 'users';
    protected array $fillable = ['name', 'email', 'password'];
    protected array $hidden = ['password'];
}
```

### 2. Erstellen einer Migration

Erstellen Sie eine neue Migration mit dem Konsolenbefehl:

```bash
php console.php db:migration:create create_users_table
```

Dies erstellt eine neue Datei in `migrations/`. Bearbeiten Sie die Datei:

```php
<?php

use App\Framework\Database\Migration;
use App\Framework\Database\Schema\Blueprint;

class CreateUsersTable extends Migration
{
    public function up(): void
    {
        $this->schema->create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });
    }

    public function down(): void
    {
        $this->schema->dropIfExists('users');
    }
}
```

### 3. Ausführen der Migration

Führen Sie die Migration aus:

```bash
php console.php db:migrate
```

### 4. Verwenden des Modells im Controller

Aktualisieren Sie den `UserController`:

```php
<?php

namespace App\Application\Controllers\Api;

use App\Application\Models\User;
use App\Framework\Http\Controller;
use App\Framework\Http\Request;
use App\Framework\Http\Response;

class UserController extends Controller
{
    public function index(Request $request): Response
    {
        $users = User::all();
        return $this->json($users);
    }

    public function show(Request $request, int $id): Response
    {
        $user = User::find($id);

        if (!$user) {
            return $this->json(['error' => 'Benutzer nicht gefunden'], 404);
        }

        return $this->json($user);
    }

    public function store(Request $request): Response
    {
        $this->validate($request, [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|string|min:8',
        ]);

        $user = User::create([
            'name' => $request->input('name'),
            'email' => $request->input('email'),
            'password' => password_hash($request->input('password'), PASSWORD_DEFAULT),
        ]);

        return $this->json($user, 201);
    }
}
```

Fügen Sie eine neue Route hinzu:

```php
$router->post('/api/users', [UserController::class, 'store']);
```

## Nächste Schritte

Nachdem Sie die Grundlagen des Frameworks kennengelernt haben, können Sie sich mit den folgenden Themen befassen:

- [Routing](../guides/routing.md) - Erfahren Sie mehr über das Routing-System
- [Controller](../guides/controllers.md) - Lernen Sie, wie Sie Controller effektiv einsetzen
- [Validierung](../guides/validation.md) - Validieren Sie Benutzereingaben
- [Datenbank](../guides/database.md) - Arbeiten Sie mit der Datenbank
- [Authentifizierung](../guides/authentication.md) - Implementieren Sie Benutzerauthentifizierung
- [Sicherheit](../guides/security.md) - Schützen Sie Ihre Anwendung

Oder erkunden Sie die [Komponenten](../components/README.md) des Frameworks, um mehr über die verfügbaren Funktionen zu erfahren.
