Skip to content

Les hooks & slots de vue

Un hook (ou slot) est un point d'insertion déclaré dans une vue : un package y greffe son contenu — un onglet sur la fiche produit, un bandeau dans le front — sans forker la vue.

Le problème

Le package « promotions » veut ajouter un onglet « Promotions » à la fiche produit du back-office. Surcharger toute la vue produit pour ça serait fragile (perdu à chaque évolution du cœur). Il faut un point d'ancrage que le cœur expose et que le package remplit.

Le principe

Le cœur (ou le thème) place un <x-hook name="…"> dans sa vue. Les packages enregistrent une vue partielle pour ce hook via le ViewHookRegistry. Au rendu, toutes les contributions s'insèrent, triées par priorité.

Greffer une vue sur un hook

Dans le boot() du provider :

php
use Slab\Framework\Core\View\Contracts\ViewHookRegistry;

$hooks = $this->app->make(ViewHookRegistry::class);
$hooks->add('back.products.edit.tabs', 'promotion::back.products.tab', priority: 20);
$hooks->add('back.products.edit.sections', 'promotion::back.products.section');

La vue partielle reçoit le contexte passé au hook (ici le produit) :

blade
{{-- promotion::back.products.tab --}}
@props(['product'])
<x-back.header.tab href="#promotions">{{ __('Promotions') }}</x-back.header.tab>

Les slots du front

Le front expose des slots garantis (contrat FrontSlotContract), remplis de la même façon :

SlotEmplacement
front.headdans <head> (méta, styles, balises tierces)
front.body.startjuste après <body> (bannières)
front.body.endavant </body> (markup et scripts différés)
front.checkout.summaryprès du récapitulatif du tunnel
php
$this->app->make(ViewHookRegistry::class)->add('front.body.end', 'mon-package::tracking');

Exposer un hook dans votre propre thème

Un thème déclare ses points d'ancrage avec le composant <x-hook> :

blade
<head>
    {{-- … --}}
    <x-hook name="front.head"/>
</head>

Disponibles sur tous les écrans d'édition

Chaque écran d'édition du back-office expose deux hooks :

  • back.<ressource>.edit.tabs — pour ajouter un onglet ;
  • back.<ressource>.edit.sections — pour ajouter une section sous le formulaire.

<ressource>areas, attributes, categories, currencies, customers, languages, order_statuses, products, taxes, tax_rules, team. Le contexte porte le modèle édité (ex. ['tax' => $tax]). Greffer un bloc sur l'écran des taxes :

php
$this->app->make(ViewHookRegistry::class)
    ->add('back.taxes.edit.sections', 'mon-package::taxes.bloc');

Onglet ou section ?

Une section est le moyen le plus simple d'ajouter un bloc à n'importe quel écran. Un onglet s'intègre pleinement aux écrans déjà multi-onglets (la fiche produit) ; sur un écran simple, préférez une section. Sans contribution, ces hooks sont invisibles (aucun changement d'affichage).

Voir aussi