PHPackages                             componist/code-block - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Templating &amp; Views](/categories/templating)
4. /
5. componist/code-block

ActiveLibrary[Templating &amp; Views](/categories/templating)

componist/code-block
====================

Laravel client for Template Archive API – fetch code blocks, categories, template images and write Blade templates to resources/views/pages

00PHP

Since Feb 26Pushed 2mo agoCompare

[ Source](https://github.com/componist/code-block)[ Packagist](https://packagist.org/packages/componist/code-block)[ RSS](/packages/componist-code-block/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Componist CodeBlock
===================

[](#componist-codeblock)

Laravel-Client für die **Template Archive** API: Code-Blöcke und Kategorien abrufen, Template-Vorschaubilder als URLs nutzen und Blade-Templates in `resources/views` (z. B. unter `pages`) erzeugen.

**Namespace:** `Componist\CodeBlock`

---

Voraussetzungen
---------------

[](#voraussetzungen)

- PHP 8.2+
- Laravel 11 oder 12
- Template-Archive-Instanz mit aktivierter API und API-Schlüssel

---

Installation
------------

[](#installation)

```
composer require componist/code-block
```

**Kein Publish nötig** – Konfiguration erfolgt über `.env`. Das Builder-JavaScript wird per Route aus dem Package ausgeliefert.

---

Konfiguration
-------------

[](#konfiguration)

### Übersicht: Alle Einstellungen

[](#übersicht-alle-einstellungen)

.env-VariableConfig-SchlüsselStandardBeschreibung`BASE_URL``base_url`*siehe Config*Basis-URL für API-Aufrufe und Preview-Bilder (ohne trailing slash). In der Package-Config: `env('BASE_URL', 'http://templatearchive.test')`. In der App empfohlen: `BASE_URL` oder `APP_URL` in `.env` setzen.`TEMPLATE_ARCHIVE_API_KEY``api_key``''`API-Schlüssel der Template-Archive-Instanz (beginnt mit `ta_`).`TEMPLATE_ARCHIVE_VIEWS_PATH``views_path``pages`Unterordner unter `resources/views`, in dem Blade-Templates erzeugt werden (z. B. `pages` → `resources/views/pages/`).–`api_cache_enabled``true`API-Antworten (Kategorien, Code-Blöcke) cachen.–`api_cache_ttl_minutes``30`Cache-Laufzeit in Minuten (nur wirksam wenn `api_cache_enabled` true).`CODE_BLOCK_TEMPLATE_ROUTE_ENABLED``route.enabled``true`Route zum Anzeigen gebauter Templates aktivieren.`CODE_BLOCK_TEMPLATE_ROUTE_PREFIX``route.prefix`*(leer = views\_path)*URL-Prefix für Template-Anzeige (z. B. `pages` oder `template`). Leer = Wert von `views_path`.`CODE_BLOCK_TEMPLATE_ROUTE_NAME``route.name``code-block.template.show`Name der Template-Anzeige-Route.–`route.middleware``[]`Middleware für die Template-Anzeige-Route (z. B. `['web']`, `['auth']`).`CODE_BLOCK_BUILDER_API_PREFIX``builder.api_prefix``code-block-builder`URL-Prefix für Builder-API (Kategorien, Blöcke, Speichern) und Asset.`CODE_BLOCK_BUILDER_OMIT_CDN``builder.omit_cdn``false``true` = Tailwind und Alpine nicht per CDN laden (wenn die Host-App sie bereits einbindet).–`builder.middleware``['web']`Middleware für alle Builder-API-Routen.`CODE_BLOCK_BUILDER_ROUTE_ENABLED``builder.route.enabled``true`Eigene Builder-Seiten-Route aktivieren.`CODE_BLOCK_BUILDER_ROUTE_PATH``builder.route.path``builder`URL-Pfad der Builder-Seite (z. B. `/builder`).`CODE_BLOCK_BUILDER_ROUTE_NAME``builder.route.name``code-block.builder.page`Name der Builder-Seiten-Route.–`builder.route.middleware``['web']`Middleware für die Builder-Seiten-Route.`CODE_BLOCK_BUILDER_PAGE_TITLE``builder.page_title``Template Builder`Seitentitel der Builder-Seite.### Kompletter .env-Block (zum Kopieren)

[](#kompletter-env-block-zum-kopieren)

Alle per `.env` konfigurierbaren Optionen in einem Block. Einfach in die `.env` einfügen und anpassen. Auskommentierte Zeilen sind optional bzw. nutzen den Standard.

```
# ---------------------------------------------------------------------------
# Componist Code-Block (Template Archive API Client)
# ---------------------------------------------------------------------------
# Basis-URL der Template-Archive-Instanz (API + Preview-Bilder). Ohne Schrägstrich am Ende.
BASE_URL=${APP_URL}

# API-Schlüssel aus dem Template-Archive-Admin (Einstellungen → API). Beginnt mit ta_
TEMPLATE_ARCHIVE_API_KEY=

# Unterordner unter resources/views für erzeugte Blade-Templates (z. B. pages)
TEMPLATE_ARCHIVE_VIEWS_PATH=pages

# Route: gebaute Templates im Browser anzeigen (GET /pages/hero-page etc.)
CODE_BLOCK_TEMPLATE_ROUTE_ENABLED=true
# CODE_BLOCK_TEMPLATE_ROUTE_PREFIX=pages
# CODE_BLOCK_TEMPLATE_ROUTE_NAME=code-block.template.show

# Builder-API und Builder-Seite
CODE_BLOCK_BUILDER_API_PREFIX=code-block-builder
CODE_BLOCK_BUILDER_ROUTE_ENABLED=true
CODE_BLOCK_BUILDER_ROUTE_PATH=builder
# CODE_BLOCK_BUILDER_ROUTE_NAME=code-block.builder.page
CODE_BLOCK_BUILDER_PAGE_TITLE=Template Builder
# Tailwind/Alpine nicht per CDN laden (true wenn die App sie schon einbindet)
# CODE_BLOCK_BUILDER_OMIT_CDN=false
```

**Hinweis:** `api_cache_enabled` und `api_cache_ttl_minutes` sowie die Middleware-Arrays werden nur in der Config-Datei gesetzt (nach `php artisan vendor:publish --tag=componist-code-block-config`).

Im Package liegt außerdem die Datei `env.code-block.example` – Inhalt in die `.env` der App kopieren und anpassen.

### Minimale .env-Einträge

[](#minimale-env-einträge)

```
TEMPLATE_ARCHIVE_API_KEY=ta_ihr_48_zeichen_langer_schluessel
TEMPLATE_ARCHIVE_VIEWS_PATH=pages
```

Optional, falls die App nicht unter `APP_URL` erreichbar ist:

```
BASE_URL=https://ihre-template-archive-instanz.de
```

### Config-Datei optional veröffentlichen

[](#config-datei-optional-veröffentlichen)

```
php artisan vendor:publish --tag=componist-code-block-config
```

Danach: `config/code-block.php` anpassen. Werte aus `.env` haben Vorrang, sofern sie dort gesetzt sind.

### Builder-Assets optional veröffentlichen

[](#builder-assets-optional-veröffentlichen)

Falls Sie `template-builder.js` selbst ausliefern möchten (z. B. für CDN/Cache):

```
php artisan vendor:publish --tag=componist-code-block-assets
```

Datei landet in `public/vendor/code-block/template-builder.js`. Standardmäßig wird das Script über die Route `GET /code-block-builder/assets/template-builder.js` aus dem Package geliefert.

---

Nutzung
-------

[](#nutzung)

### Client injizieren

[](#client-injizieren)

```
use Componist\CodeBlock\Client;

// Im Controller, Job, Command etc.
public function __construct(
    private Client $client
) {}
```

### Code-Blöcke

[](#code-blöcke)

MethodeBeschreibung`getCodeBlocks(?int $categoryId = null): array`Alle Code-Blöcke; optional gefiltert nach `category_id`. Wirft `Illuminate\Http\Client\RequestException` bei API-Fehlern.`getCodeBlock(int $id): array`Einzelnen Code-Block nach ID.```
$blocks = $client->getCodeBlocks();           // alle
$blocks = $client->getCodeBlocks(categoryId: 1);

$block = $client->getCodeBlock(7);
```

### Kategorien

[](#kategorien)

MethodeBeschreibung`getCodeCategories(): array`Alle Code-Kategorien.`getCodeCategory(int $id): array`Eine Kategorie inkl. zugehöriger `code_blocks`.```
$categories = $client->getCodeCategories();
$category = $client->getCodeCategory(1);
```

### Preview-Bilder

[](#preview-bilder)

Die API liefert bei Code-Blöcken `preview_image` als relativen Pfad (z. B. `code-blocks/abc.jpg`). Der Client baut daraus die volle URL.

MethodeBeschreibung`getPreviewImageUrl(?string $previewImagePath): ?string`Aus relativem Pfad wird `{BASE_URL}/storage/{path}` (ohne `public/` im Pfad).`withPreviewImageUrls(array $blocks): array`Fügt jedem Block im Array das Feld `preview_image_url` hinzu (in place).```
$url = $client->getPreviewImageUrl($block['preview_image']);

$blocks = $client->getCodeBlocks(1);
$blocks = $client->withPreviewImageUrls($blocks);
// Jeder Eintrag hat nun zusätzlich 'preview_image_url'
```

### Blade-Templates erzeugen

[](#blade-templates-erzeugen)

MethodeBeschreibung`createTemplateFromBlockId(int $codeBlockId, string $filename): string`Holt den Block von der API und schreibt eine Blade-Datei. Gibt den vollen Dateipfad zurück.`createTemplateFromBlocks(array $blocks, string $filename): string`Erzeugt eine Blade-Datei aus mehreren Blöcken. Jeder Block: `['html' => ?, 'css' => ?, 'js' => ?]`. Gibt den vollen Dateipfad zurück.Dateiname: Nur Zeichen `a-zA-Z0-9_-` werden übernommen; ungültige Zeichen werden entfernt. Leerer Name wird zu `template`.

```
// Ein Block von der API → Blade
$path = $client->createTemplateFromBlockId(7, 'hero-page');
// → z. B. .../resources/views/pages/hero-page.blade.php

// Mehrere Blöcke (z. B. aus API geholt)
$path = $client->createTemplateFromBlocks([
    ['html' => '...', 'css' => '...', 'js' => '...'],
    ['html' => '...', 'css' => null, 'js' => null],
], 'landing-page');
```

### TemplateWriter und ApiClient

[](#templatewriter-und-apiclient)

MethodeBeschreibung`getTemplateWriter(): TemplateWriter`Instanz für Views-Pfad und Verzeichnis-Erstellung.`getApiClient(): ApiClient`Low-Level API-Client.```
$writer = $client->getTemplateWriter();
$writer->getViewsPath();           // z. B. .../resources/views/pages
$writer->ensureViewsDirectoryExists();
```

---

Artisan-Befehle
---------------

[](#artisan-befehle)

BefehlBeschreibung`php artisan code-block:categories`Listet alle Kategorien (ID, Name, Description) aus der Template-Archive-API.`php artisan code-block:blocks`Listet alle Code-Blöcke (ID, Title, Category, Preview-Pfad).`php artisan code-block:blocks --category=1`Nur Blöcke der Kategorie mit ID 1.`php artisan code-block:blocks --with-urls`Zusätzlich Spalte „Preview URL“ (volle URLs).`php artisan code-block:pull {block_id} {filename}`Holt Block von der API und erzeugt `resources/views/{views_path}/{filename}.blade.php`.Beispiele:

```
php artisan code-block:categories
php artisan code-block:blocks --category=1 --with-urls
php artisan code-block:pull 7 hero-page
```

---

Routen
------

[](#routen)

### Template-Anzeige (gebaute Templates im Browser)

[](#template-anzeige-gebaute-templates-im-browser)

Aktivierung: `CODE_BLOCK_TEMPLATE_ROUTE_ENABLED=true` (Standard).

- **URL:** `GET /{prefix}/{name}`
    - `prefix` = `CODE_BLOCK_TEMPLATE_ROUTE_PREFIX` oder, wenn leer, `TEMPLATE_ARCHIVE_VIEWS_PATH` (z. B. `pages`).
    - `name` = Dateiname ohne `.blade.php` (nur `a-z0-9_-`).
- **Beispiel:** `GET /pages/hero-page` rendert die View `pages.hero-page`.
- **Route-Name:** `code-block.template.show`
    - Beispiel: `route('code-block.template.show', 'hero-page')`.

Die View erhält `['title' => ...]` (aus dem Dateinamen abgeleitet). Existiert die View nicht, wird 404 zurückgegeben.

**Deaktivieren:** `CODE_BLOCK_TEMPLATE_ROUTE_ENABLED=false`.
**Middleware:** In `config/code-block.php` unter `route.middleware` setzen (z. B. `['web']`, `['auth']`).

---

### Template-Builder (Seite + API)

[](#template-builder-seite--api)

#### Builder-Seiten-Route

[](#builder-seiten-route)

Aktivierung: `CODE_BLOCK_BUILDER_ROUTE_ENABLED=true` (Standard).

- **URL:** `GET /builder` (oder Wert von `CODE_BLOCK_BUILDER_ROUTE_PATH`).
- **Route-Name:** `code-block.builder.page`
    - Beispiel: `route('code-block.builder.page')`.
- **Inhalt:** Blade-View `code-block::builder-page` mit Komponente ``, Tailwind v4 und Alpine.js (sofern nicht `omit_cdn`), plus `template-builder.js` von der Builder-Asset-Route.

**Deaktivieren:** `CODE_BLOCK_BUILDER_ROUTE_ENABLED=false`. Die Builder-API-Routen bleiben davon unberührt.

#### Builder nur als Komponente (ohne eigene Route)

[](#builder-nur-als-komponente-ohne-eigene-route)

Auf einer beliebigen Route/Seite: `` einbinden. Im Layout CSRF-Meta-Tag setzen: ``. Die API-URLs werden von der Komponente per Route-Namen gesetzt.

#### Builder-API (für Alpine.js / Frontend)

[](#builder-api-für-alpinejs--frontend)

Alle unter dem Prefix `CODE_BLOCK_BUILDER_API_PREFIX` (Standard: `code-block-builder`), Middleware: `builder.middleware` (Standard: `['web']`).

MethodeURLBeschreibungGET`/{api_prefix}/categories`Kategorien von der Template-Archive-API.GET`/{api_prefix}/blocks?category_id={id}`Code-Blöcke (mit `preview_image_url`).POST`/{api_prefix}/templates`Template speichern. Body: `{ "name": "hero-page", "block_ids": [1, 2, 3] }`.GET`/{api_prefix}/assets/template-builder.js`Liefert `template-builder.js` aus dem Package.**POST /templates – Validierung:**

- `name`: erforderlich, 1–255 Zeichen, nur `a-z0-9_-` (Regex: `^[a-z0-9_-]+$`).
- `block_ids`: Array, mindestens ein Element; jedes Element Integer ≥ 1.

Antwort bei Erfolg: `{ "path": "...", "message": "..." }`. Bei Fehler: 502 mit `{ "message": "..." }`.

---

Erzeugte Blade-Dateien
----------------------

[](#erzeugte-blade-dateien)

- **Speicherort:** `resources/views/{views_path}/{filename}.blade.php` (z. B. `resources/views/pages/hero-page.blade.php`).
- **Inhalt:** Eigenständiges HTML-Dokument mit DOCTYPE, ``, Tailwind v4 (CDN), optional `` und ``. HTML/CSS/JS der Blöcke steht in `@verbatim`, damit `{{ }}` und `@` in den Blöcken nicht von Blade interpretiert werden.
- **Title:** `@yield('title', config('app.name'))`.

---

API-Cache
---------

[](#api-cache)

- **Aktivierung:** `config('code-block.api_cache_enabled')` (Standard: `true`).
- **TTL:** `config('code-block.api_cache_ttl_minutes')` (Standard: `30`). Bei 0 oder wenn Cache deaktiviert ist, wird nicht gecacht.
- Gecacht werden: `getCodeBlocks` (pro Kategorie und „all“), `getCodeBlock`, `getCodeCategories`, `getCodeCategory`.
- Cache-Key-Präfix: `componist.code_block.api`. Bei `app.debug` true wird ein Cache-Hit ins Log geschrieben.

---

Lizenz
------

[](#lizenz)

MIT

###  Health Score

19

—

LowBetter than 10% of packages

Maintenance56

Moderate activity, may be stable

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity12

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/d5e1e9db4bf5b8deab7854a0bf9596004deb755d27d2e5e9c64de9ceea564afd?d=identicon)[Componist](/maintainers/Componist)

---

Top Contributors

[![Reinhold-Jesse](https://avatars.githubusercontent.com/u/88349887?v=4)](https://github.com/Reinhold-Jesse "Reinhold-Jesse (3 commits)")

### Embed Badge

![Health badge](/badges/componist-code-block/health.svg)

```
[![Health](https://phpackages.com/badges/componist-code-block/health.svg)](https://phpackages.com/packages/componist-code-block)
```

###  Alternatives

[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9682.1M97](/packages/roots-acorn)[whitecube/nova-flexible-content

Flexible Content &amp; Repeater Fields for Laravel Nova.

8053.0M25](/packages/whitecube-nova-flexible-content)[mopa/bootstrap-bundle

Easy integration of twitters bootstrap into symfony2

7042.9M33](/packages/mopa-bootstrap-bundle)[limenius/react-bundle

Client and Server-side react rendering in a Symfony Bundle

3871.2M](/packages/limenius-react-bundle)[nicmart/string-template

StringTemplate is a very simple string template engine for php. I've written it to have a thing like sprintf, but with named and nested substutions.

2101.7M30](/packages/nicmart-string-template)[symfony/ux-icons

Renders local and remote SVG icons in your Twig templates.

545.8M69](/packages/symfony-ux-icons)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
