Maison > développement back-end > tutoriel php > Construisez votre propre cadre PHP avec des composants Symfony

Construisez votre propre cadre PHP avec des composants Symfony

Joseph Gordon-Levitt
Libérer: 2025-02-19 10:00:16
original
203 Les gens l'ont consulté

Ce tutoriel montre la construction d'un cadre PHP minimal à l'aide de composants Symfony. Bien qu'il ne soit pas exhaustif, il couvre les éléments principaux d'une application fonctionnelle. Pour des plongées plus profondes, consultez la documentation officielle de Symfony.

Build your own PHP Framework with Symfony Components

Concepts clés:

Ce tutoriel exploite les composants Symfony pour construire un cadre flexible. Il utilise HTTPFoundation pour gérer les demandes et les réponses HTTP, en remplaçant les globaux PHP standard. Le composant de routage permet la manipulation dynamique de l'URL et le composant EventDispatcher facilite la modularité et l'extensibilité via le motif d'observateur. Enfin, le composant httpkernel rationalise la génération de traitement de la demande et de réponse.

Configuration du projet:

Commencez par un fichier de base index.php et installez les composants nécessaires à l'aide du compositeur:

php composer.phar require symfony/http-foundation symfony/http-kernel symfony/routing symfony/event-dispatcher
Copier après la connexion

httpfoundation:

httpfoundation fournit des classes Request et Response. Initialement, index.php pourrait ressembler à ceci (en utilisant des globaux):

switch($_SERVER['PATH_INFO']) {
    case '/': echo 'Home'; break;
    case '/about': echo 'About'; break;
    default: echo 'Not Found!';
}
Copier après la connexion

Ceci est amélioré en utilisant httpfoundation:

require 'vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();
$response = new Response();

switch ($request->getPathInfo()) {
    case '/': $response->setContent('Home'); break;
    case '/about': $response->setContent('About'); break;
    default: $response->setContent('Not Found!')->setStatusCode(Response::HTTP_NOT_FOUND);
}

$response->send();
Copier après la connexion

httpkernel:

Pour encapsuler la logique du framework, créez une classe Core (par exemple, lib/Framework/Core.php):

<?php
namespace Framework;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class Core implements HttpKernelInterface {
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true) {
        switch ($request->getPathInfo()) {
            case '/': return new Response('Home');
            case '/about': return new Response('About');
            default: return new Response('Not Found!', Response::HTTP_NOT_FOUND);
        }
    }
}
Copier après la connexion

Mise à jour index.php:

require 'lib/Framework/Core.php';
$request = Request::createFromGlobals();
$app = new Framework\Core();
$response = $app->handle($request);
$response->send();
Copier après la connexion

Routing amélioré (composant de routage):

La classe Core est améliorée avec un système de routage en utilisant le composant de routage:

<?php
// ... (previous code) ...
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;

class Core implements HttpKernelInterface {
    protected $routes;

    public function __construct() { $this->routes = new RouteCollection(); }

    public function handle(Request $request) {
        $context = new RequestContext();
        $context->fromRequest($request);
        $matcher = new UrlMatcher($this->routes, $context);

        try {
            $attributes = $matcher->match($request->getPathInfo());
            $controller = $attributes['controller'];
            unset($attributes['controller']);
            return call_user_func_array($controller, $attributes);
        } catch (ResourceNotFoundException $e) {
            return new Response('Not Found!', Response::HTTP_NOT_FOUND);
        }
    }

    public function map($path, $controller) {
        $this->routes->add($path, new Route($path, ['controller' => $controller]));
    }
}
Copier après la connexion

Les routes sont désormais définies dans index.php:

$app->map('/', function() { return new Response('Home'); });
$app->map('/about', function() { return new Response('About'); });
// ...
Copier après la connexion

EventDispatcher:

Le composant EventDispatcher ajoute des capacités de gestion des événements. Ajoutez une méthode on et une méthode A fire à la classe Core et une classe RequestEvent. (Détails d'implémentation omis pour la concision, mais similaire à l'exemple de l'entrée d'origine). Les auditeurs peuvent être ajoutés en utilisant $app->on('request', ...);.

Ce cadre fournit une base pour créer des applications plus complexes en utilisant la puissance et la flexibilité de Symfony. N'oubliez pas de consulter la documentation officielle de Symfony pour des fonctionnalités et des détails de composants plus avancés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal