Salt la conținut

Ciclul unui request

Această pagină leagă între ele componentele de bază ale framework-ului. După ce termini Quickstart-ul, aici vezi cum circulă un request de la browser până la răspuns, printr-un exemplu complet: afișarea unui articol după id.

Fluxul are cinci etape:

Request  ->  Rutare  ->  Controller  ->  View  ->  Response
  1. Aplicația primește request-ul HTTP și pornește contextul de execuție.
  2. Rutarea găsește ruta care se potrivește și extrage parametrii din URL.
  3. Controller-ul primește parametrii, încarcă datele din modele și pregătește răspunsul.
  4. View-ul transformă datele într-un HTML.
  5. Response trimite rezultatul înapoi la browser.

1. Aplicația pornește

Punctul de intrare (public/index.php) inițializează framework-ul și pornește contextul potrivit. Pentru o aplicație clasică, contextul e SingleAppContext:

$app = \Leto\Base::getInstance();
$app->run([\Leto\Context\SingleAppContext::class]);

Contextul se ocupă de tot restul: potrivește ruta, apelează controller-ul și trimite răspunsul. Vezi Aplicația pentru contexte și configurare.

2. Definește ruta

Ruta leagă un URL de o metodă de controller. Parametrul {id} din cale devine disponibil în controller:

use App\Controllers\PostController;
use Leto\Routing\RoutesCollector;

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

Detalii despre parametri, middleware și rute numite: Rutare.

3. Controller-ul primește parametrii

Parametrii rutei ajung în controller după nume: {id} din URL se leagă de argumentul $id al metodei. Controller-ul încarcă modelul și pregătește datele:

namespace App\Controllers;

use App\Models\Post;
use Leto\Http\Response;
use Leto\Views\View;

class PostController
{
    public function show(int $id): Response
    {
        $post = Post::find($id);

        $view = new View('posts/show', ['post' => $post], [app_path('Views')]);

        return new Response($view->render());
    }
}

Numele argumentului contează, nu poziția: {id} se potrivește cu $id. Vezi Operațiuni CRUD pentru find() și restul metodelor de model.

4. View-ul randează datele

View-ul primește datele prin al doilea argument și caută fișierul template în directoarele din al treilea argument. Aici posts/show se rezolvă la Views/posts/show.php (sau .twig):

// Views/posts/show.php
<article>
    <h1><?= e($post->title) ?></h1>
    <div><?= $post->body ?></div>
</article>
View-ul are nevoie de cel puțin un director de căutare (al treilea argument). Fără el, render() întoarce un string gol, fără eroare. Detalii și escaparea corectă: Views.

5. Response ajunge la browser

Controller-ul întoarce un Response. Contextul îl trimite automat la client. Un controller poate întoarce fie un Response, fie direct un string (care e împachetat într-un Response):

return new Response($view->render());
// sau, pentru un răspuns simplu:
return new Response('Salut!');

Pentru JSON, dă un array la Response, iar framework-ul îl serializează automat. Vezi HTTP pentru Response, Redirect și URL.

Pe scurt

EtapăComponentăCe face
RequestAplicațiaPornește contextul de execuție
RutareRoutesCollectorPotrivește URL-ul, extrage {id}
Controllerclasa taPrimește $id, încarcă Post::find($id)
ViewViewRandează posts/show cu datele
ResponseResponseTrimite HTML-ul la browser

De aici poți intra în fiecare componentă în parte, în ordinea din bara laterală: Aplicația, Rutare, HTTP, Views, apoi partea de date cu Struct, Validare și ORM.