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#
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 :
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 :
$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 :
bext_invalidate("products");
bext_publish("orders", ["id" => 123]);
bext_task("cleanup", "0 2 * * *", "cache::gc");
API de cache#
class BextCache
{
public function invalidate(string $tag): bool;
public function invalidatePath(string $pattern): bool;
public function flush(): bool;
}
API en temps réel#
class BextRealtime
{
public function publish(string $topic, mixed $data = null): bool;
}
API de planification des tâches#
class BextTasks
{
public function register(string $name, string $cron, string $command): bool;
public function list(): array;
public function cancel(string $name): bool;
}
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
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 :
[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 :
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 :
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#
- Intégration Laravel — le modèle de travail PHP intégré que partage Symfony
- Référence d'exécution PHP — liste complète des champs de configuration
[php]et options ini - Guide de mise en cache — TTL, périmé pendant la revalidation et invalidation de balise
- TLS et HTTPS — certificats ACME automatiques
- Sécurité et WAF — protections de bord devant Symfony
- Présentation des frameworks — comment bext s'intègre aux frameworks backend
Links#
- Symfony — documentation officielle Symfony