Quickstart
Cerințe de sistem
| Cerință | Versiune |
|---|---|
| PHP | >= 8.4 |
| bcmath | * |
| curl | * |
| fileinfo | * |
| intl | * |
| json | * |
| pdo | * |
| MariaDB / MySQL | >= 10.3 |
1. Configurează Composer
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_TAUcomposer require leto/framework2. Creează o aplicație nouă
composer create-project leto/app numele-proiectuluiStructura 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.json3. 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 -dDeschide 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