Zum Inhalt springen

Klassen-Utilities

Attribute in class-Vorlagen zu erstellen, bedeutet, Zeichenfolgen zusammenzufügen, Klassen bedingt umzuschalten und zu verhindern, dass spätere Utilities mit früheren kollidieren (p-2 und p-4 sollten nicht beide bestehen bleiben). In JavaScript ist diese Arbeit auf clsx und tailwind-merge verteilt. TailwindPHP enthält PHP-Portierungen beider Bibliotheken, sodass du dasselbe Verhalten ohne Node.js-Toolchain und ohne zusätzliche Composer-Pakete erhältst.

Drei Funktionen decken das gesamte Spektrum ab: cn() erstellt und löst Konflikte auf, merge() löst nur Konflikte auf und join() fügt nur zusammen.

cn()

Das empfohlene Hilfsprogramm. Es erstellt zuerst bedingt nach clsx-Art und löst dann Konflikte zwischen Tailwind-Klassen mit tailwind-merge auf – die zuletzt angegebene kollidierende Utility gewinnt.

PHP
use function TailwindPHP\cn;

// Conflicts are resolved — px-4 overrides px-2
cn('px-2 py-1', 'px-4');
// => 'py-1 px-4'

// Conditional classes via a key => bool array
cn('btn', ['btn-primary' => true, 'btn-disabled' => false]);
// => 'btn btn-primary'

Akzeptierte Argumente

cn() akzeptiert beliebig viele Argumente. Jedes wird nach clsx-Semantik abgeflacht und gefiltert:

Argument Verhalten
string Wird unverändert hinzugefügt.
int / float Wird in eine Zeichenfolge umgewandelt und hinzugefügt.
Sequenzielles Array Jedes Element wird rekursiv verarbeitet.
Array key => bool Jeder Schlüssel wird hinzugefügt, wenn sein Wert wahrheitsgetreu ist.
null, false, 0, '' Werden ignoriert.
PHP
cn('flex', ['items-center' => true], ['p-4', ['gap-2']], null);
// => 'flex items-center p-4 gap-2'

Komponenten-Muster

cn() macht eine Komponente überschreibbar: Führe die eigenen Klassen der Komponente mit den vom Aufrufer übergebenen zusammen; Konflikte werden zugunsten des Aufrufers aufgelöst.

PHP
use function TailwindPHP\cn;

function Card(array $props = []): string {
    $class = cn(
        'rounded-lg border bg-card text-card-foreground shadow-sm',
        $props['class'] ?? null
    );
    return "<div class=\"{$class}\">" . ($props['children'] ?? '') . "</div>";
}

Card(['class' => 'p-6', 'children' => 'Content']);
// <div class="rounded-lg border bg-card text-card-foreground shadow-sm p-6">Content</div>

Für deklarative Komponentenstile mit mehreren Achsen kombinierst du cn() mit variants().

merge()

Nur Konfliktauflösung – keine bedingte Erstellung. Übergib Klassenzeichenfolgen; spätere Klassen überschreiben frühere, wenn sie dieselbe Eigenschaft betreffen. Verwende es, wenn deine Eingabe bereits aus einfachen Zeichenfolgen besteht.

PHP
use function TailwindPHP\merge;

merge('px-2 py-1 bg-red-500', 'px-4 bg-blue-500');
// => 'py-1 px-4 bg-blue-500'

// Conflict resolution is variant-aware
merge('hover:bg-red-500', 'hover:bg-blue-500');
// => 'hover:bg-blue-500'

cn() ist merge() auf clsx aufgebaut. Verwende merge() direkt nur, wenn du keine bedingte Array-Syntax brauchst.

join()

Einfaches Zusammenfügen ohne Konfliktauflösung. Falsy-Werte werden entfernt, kollidierende Utilities bleiben jedoch alle erhalten. Verwende es, wenn du weißt, dass keine Konflikte auftreten, und die einfachste Option möchtest.

PHP
use function TailwindPHP\join;

join('foo', 'bar', null, 'baz');
// => 'foo bar baz'

Welche Funktion sollte ich verwenden?

Funktion Erstellt (Bedingungen, Arrays) Löst Konflikte auf Verwenden, wenn …
cn() ja ja Standardwahl – du Klassenzeichenfolgen erstellst, bei denen Konflikte auftreten können.
merge() nein ja Die Eingabe aus einfachen Zeichenfolgen besteht und du nur Konflikte auflösen musst.
join() ja nein Du weißt, dass keine Konflikte auftreten, und möglichst wenig Aufwand möchtest.

Importe

PHP
use function TailwindPHP\cn;
use function TailwindPHP\merge;
use function TailwindPHP\join;

Alle drei befinden sich im Haupt-Namespace TailwindPHP und sind im Paket enthalten. Es sind PHP-Portierungen von clsx (von Luke Edwards) und tailwind-merge (von Dany Castillo).