Salt la conținut

Quickstart

Cerințe de sistem

CerințăVersiune
PHP>= 8.4
bcmath*
curl*
fileinfo*
intl*
json*
pdo*
MariaDB / MySQL>= 10.3

1. Configurează Composer

Pachetul leto/framework este distribuit prin registry-ul GitLab intern Workleto. Ai nevoie de un cont intern și de un token cu acces la pachete.

Adaugă repository-ul GitLab în composer.json:

{
    "repositories": {
        "321": {
            "type": "composer",
            "url": "https://gitlab.internal.workleto.com/api/v4/group/321/-/packages/composer/"
        }
    },
    "config": {
        "gitlab-domains": ["gitlab.internal.workleto.com"]
    }
}

Configurează un token GitLab cu permisiune read_package:

composer config --global gitlab-token.gitlab.internal.workleto.com TOKENUL_TAU
composer require leto/framework

2. Creează o aplicație nouă

composer create-project leto/app numele-proiectului

Structura proiectului

numele-proiectului/
├── app/                  # Modulele aplicației
│   ├── App.php           # Clasa principală a aplicației
│   ├── Controllers/      # Controller-ele aplicației
│   ├── Models/           # Modelele ORM
│   └── Views/            # Template-uri (.php / .twig)
├── config/               # Fișiere de configurare
│   ├── app.php
│   ├── cors.php
│   └── database.php
├── docker/               # Configurație Docker (dev + prod)
│   ├── apache/
│   ├── image/
│   └── php/
├── public/               # Document root
│   ├── index.php
│   ├── .htaccess
│   └── robots.txt
├── resources/            # Resurse statice
├── storage/              # Storage (log-uri, erori)
├── system/               # Biblioteca de sistem
├── docker-compose.dev.yml
└── composer.json

3. Configurează baza de date

Editează config/database.php:

return [
    'default' => [
        'driver' => 'mysql',
        'host' => 'mysql',
        'port' => 3306,
        'database' => 'numele_proiectului',
        'username' => 'root',
        'password' => 'parola',
        'charset' => 'utf8mb4',
    ],
];

4. Pornește serverul

docker compose -f docker-compose.dev.yml up -d

Deschide http://localhost. Vei vedea pagina generată de HelloController.


Primul tău controller

Creează app/Controllers/HelloController.php:

namespace App\Controllers;

use Leto\Http\Response;

class HelloController
{
    public function hello(): Response
    {
        return new Response('Salut din Leto!');
    }
}

Înregistrează ruta în app/App.php:

namespace App;

use App\Controllers\HelloController;
use Leto\AppBuilder\Application;
use Leto\Routing\RoutesCollector;

class App extends Application
{
    public function routes(RoutesCollector $route): void
    {
        $route->get('/', [HelloController::class, 'hello']);
    }
}

Primul tău model

use Leto\Database\ORM\Model;
use Leto\Database\ORM\Attributes\Table;
use Leto\Database\ORM\Attributes\PrimaryKey;
use Leto\Database\ORM\Attributes\AutoIncrement;
use Leto\Database\ORM\Attributes\DataStorage\Varchar;
use Leto\Database\ORM\Attributes\DataStorage\Text;

#[Table('posts')]
class Post extends Model
{
    #[PrimaryKey, AutoIncrement]
    public int $id;

    #[Varchar(200)]
    public string $title;

    #[Text]
    public string $body;
}

// Creare
$post = new Post();
$post->title = 'Primul articol';
$post->body = 'Conținutul articolului...';
$post->create();

// Interogare
$posts = Post::all()->orderBy('id')->get();

// Găsire
$post = Post::find(1);

#[Text] pentru $body pentru că #[Varchar] fără lungime se limitează la 255 de caractere (vezi Tipuri de stocare).


Cum apar tabelele

La nivel de framework, atributele unui model descriu o tabelă existentă, nu o creează. Coloanele declarate în model trebuie să corespundă coloanelor din tabelă. Deci, înainte ca Post::create() de mai sus să funcționeze, tabela posts trebuie să existe.

Creezi tabela o singură dată cu Query Builder, care oferă DDL fluent:

db()->createTable('posts')
    ->column('id', 'INT(11)')
    ->column('title', 'VARCHAR(200)')
    ->column('body', 'TEXT')
    ->primaryKey('id')
    ->autoIncrement('id')
    ->execute();

Coloanele din DDL oglindesc 1-la-1 atributele modelului. Pentru toate căile de a obține schema (DDL manual, tabelă deja existentă, sincronizare automată prin platforma Workleto), vezi Schemă și migrări.


Pașii următori

  • Ciclul unui request: cum se leagă rutarea, controller-ul, view-ul și răspunsul într-o funcție completă
  • ORM: modele, relații, hook-uri, best practices
  • Validare: validare date din formular și API
  • Query Builder: acces direct la baza de date
  • Struct: containere de date tipizate