ENbext.dev
DocumentationIntégrations de frameworks

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

Intégration Symfony

Le package bext/symfony fournit un bundle Symfony Flex qui enregistre automatiquement les services de cache, de temps réel et de tâches de bext pour l'injection de dépendances.

Installation#

bash
composer require bext/symfony

Configuration requise pour : PHP >= 8.2, Symfony 6.4 ou 7.0

L'ensemble est automatiquement enregistré via Symfony Flex — aucune configuration manuelle n'est nécessaire.

Câblage automatique#

Injectez les services bext dans n’importe quel contrôleur ou service :

php
use Bext\Symfony\BextCache;
use Bext\Symfony\BextRealtime;
use Bext\Symfony\BextTasks;

class ProductController extends AbstractController
{
    public function __construct(
        private BextCache $cache,
        private BextRealtime $realtime,
        private BextTasks $tasks,
    ) {}

    #[Route('/api/products/{id}', methods: ['PUT'])]
    public function update(string $id, Request $request): JsonResponse
    {
        $product = $this->productRepo->update($id, $request->toArray());

        $this->cache->invalidate("products");
        $this->realtime->publish("products", [
            "action" => "updated",
            "id" => $id,
        ]);

        return $this->json($product);
    }
}

Alias ​​de conteneur#

Les services sont également disponibles via des alias de conteneur :

php
$this->container->get('bext.cache');
$this->container->get('bext.realtime');
$this->container->get('bext.tasks');

Aides mondiales#

Mêmes fonctions d'assistance que l'adaptateur Laravel :

php
bext_invalidate("products");
bext_publish("orders", ["id" => 123]);
bext_task("cleanup", "0 2 * * *", "cache::gc");

API de cache#

php
class BextCache
{
    public function invalidate(string $tag): bool;
    public function invalidatePath(string $pattern): bool;
    public function flush(): bool;
}

API en temps réel#

php
class BextRealtime
{
    public function publish(string $topic, mixed $data = null): bool;
}

API de planification des tâches#

php
class BextTasks
{
    public function register(string $name, string $cron, string $command): bool;
    public function list(): array;
    public function cancel(string $name): bool;
}
Conseil

Si vous exécutez Symfony derrière un serveur de processus distinct de type Puma, consultez plutôt Proxy inverse / multi-applications. Cette page couvre le mode de travail PHP intégré, qui maintient le noyau Symfony au chaud pendant le processus pour une surcharge de moins d'une milliseconde par requête.

Mode Travailleur#

Comme l'adaptateur Laravel, Symfony prend en charge le mode travailleur pour une gestion des demandes hautes performances.

Installation#

Créez un worker.php :

php
<?php
require __DIR__ . '/vendor/autoload.php';

$kernel = new \App\Kernel(
    $_SERVER['APP_ENV'] ?? 'prod',
    (bool) ($_SERVER['APP_DEBUG'] ?? false)
);

\Bext\Symfony\Worker::run($kernel);

Configurer dans bext.config.toml :

toml
[php]
enabled = true
document_root = "./public"
workers = 4
worker_script = "./worker.php"
max_requests = 10000

Performance#

Mode Frais généraux par requête
Classique (démarre le noyau à chaque requête) 1 à 5 ms
Worker (noyau gardé au chaud en mémoire) dizaines de microsecondes

Le travailleur conserve le conteneur DI, le comparateur d'itinéraire et le répartiteur d'événements de Symfony chargés en mémoire. Seul l’état spécifique à la demande est recréé par demande.

Pont SSR React#

Rendu des composants React à partir des contrôleurs Symfony :

php
use function Bext\Symfony\react;

#[Route('/dashboard')]
public function dashboard(): Response
{
    $html = react("Dashboard", [
        "user" => $this->getUser(),
        "metrics" => $this->metricsService->getSummary(),
    ]);

    return new Response($html);
}

Utilise le même chemin de rendu accéléré par FFI que l'adaptateur Laravel lors de l'exécution en mode Worker.

Intégration des abonnés aux événements#

Vous pouvez intégrer les services bext au système d'événements de Symfony :

php
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class CacheInvalidationSubscriber implements EventSubscriberInterface
{
    public function __construct(private BextCache $cache) {}

    public static function getSubscribedEvents(): array
    {
        return [
            ProductUpdatedEvent::class => 'onProductUpdated',
        ];
    }

    public function onProductUpdated(ProductUpdatedEvent $event): void
    {
        $this->cache->invalidate("products");
        $this->cache->invalidatePath("/products/{$event->getProductId()}");
    }
}

En rapport#

  • Symfony — documentation officielle Symfony
Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.