Rumah >pembangunan bahagian belakang >tutorial php >Bina kerangka PHP anda sendiri dengan komponen Symfony

Bina kerangka PHP anda sendiri dengan komponen Symfony

Joseph Gordon-Levitt
Joseph Gordon-Levittasal
2025-02-19 10:00:16200semak imbas

Tutorial ini menunjukkan membina rangka kerja PHP yang minimum menggunakan komponen Symfony. Walaupun tidak lengkap, ia meliputi elemen teras untuk aplikasi berfungsi. Untuk menyelam yang lebih mendalam, berunding dengan dokumentasi Symfony rasmi.

Build your own PHP Framework with Symfony Components

Konsep Utama:

Tutorial ini memanfaatkan komponen simfoni untuk membina rangka kerja yang fleksibel. Ia menggunakan HTTPFoundation untuk menguruskan permintaan dan respons HTTP, menggantikan Global PHP standard. Komponen penghalaan membolehkan pengendalian URL dinamik, dan komponen EventDispatcher memudahkan modulariti dan extensibility melalui corak pemerhati. Akhirnya, komponen httpkernel menyelaraskan pemprosesan permintaan dan penjanaan tindak balas.

Persediaan Projek:

Mulakan dengan fail

asas dan pasang komponen yang diperlukan menggunakan komposer: index.php

<code class="language-bash">php composer.phar require symfony/http-foundation symfony/http-kernel symfony/routing symfony/event-dispatcher</code>
httpfoundation:

httpfoundation menyediakan

dan

kelas. Pada mulanya, Request mungkin kelihatan seperti ini (menggunakan global): Response index.php

Ini diperbaiki dengan menggunakan httpfoundation:
<code class="language-php">switch($_SERVER['PATH_INFO']) {
    case '/': echo 'Home'; break;
    case '/about': echo 'About'; break;
    default: echo 'Not Found!';
}</code>

httpkernel:
<code class="language-php">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();</code>

untuk merangkum logik rangka kerja, buat kelas (mis.,

):

Core lib/Framework/Core.php UPDATE

:
<code class="language-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);
        }
    }
}</code>

index.php

routing yang lebih baik (komponen penghalaan):
<code class="language-php">require 'lib/Framework/Core.php';
$request = Request::createFromGlobals();
$app = new Framework\Core();
$response = $app->handle($request);
$response->send();</code>

kelas dipertingkatkan dengan sistem penghalaan menggunakan komponen penghalaan:

Core laluan kini ditakrifkan dalam

:
<code class="language-php"><?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]));
    }
}</code>

index.php

EventDispatcher:
<code class="language-php">$app->map('/', function() { return new Response('Home'); });
$app->map('/about', function() { return new Response('About'); });
// ...</code>

Komponen EventDispatcher menambah keupayaan pengendalian acara. Tambah kaedah dan kaedah

ke kelas

dan kelas on. (Butiran pelaksanaan yang ditinggalkan untuk keringkasan, tetapi serupa dengan contoh dalam input asal). Pendengar boleh ditambah menggunakan fire. Core RequestEvent Rangka kerja ini menyediakan asas untuk membina aplikasi yang lebih kompleks menggunakan kuasa dan fleksibiliti Symfony. Ingatlah untuk berunding dengan dokumentasi Symfony rasmi untuk ciri -ciri dan butiran komponen yang lebih canggih. $app->on('request', ...);

Atas ialah kandungan terperinci Bina kerangka PHP anda sendiri dengan komponen Symfony. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn