Vývojář Vývoj pluginů

Vývoj pluginů

Plugin pro Laravix je obyčejný Composer balíček s Laravel service providerem, který se do CMS zapojuje přes registry. First-party pluginy Docs a Changelog — ty, co pohánějí laravix.com — jsou postavené přesně takhle a tento článek vás provede stejným receptem.

Předpoklady

  • Funkční instalace Laravixu (Instalace) nebo monorepo (Lokální vývoj).
  • Znalost Laravel balíčků (service providery, auto-discovery).

1. Kostra balíčku

my-plugin/
├── composer.json
├── src/
│   └── MyPluginServiceProvider.php
├── routes/            (volitelné)
├── database/migrations/  (volitelné)
└── resources/
    ├── views/
    └── lang/

composer.json s auto-discovery provideru:

{
    "name": "acme/my-plugin",
    "type": "library",
    "autoload": {
        "psr-4": { "Acme\\MyPlugin\\": "src/" }
    },
    "require": { "php": "^8.4" },
    "extra": {
        "laravel": {
            "providers": ["Acme\\MyPlugin\\MyPluginServiceProvider"]
        }
    }
}

Do webu ho nainstalujete přes composer require acme/my-plugin (během vývoje path repozitářem).

2. Service provider

Provider Changelog pluginu je kompaktní šablonou všech pohyblivých částí:

namespace Acme\MyPlugin;

use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
use Laravix\Cms\Support\BlockRegistry;
use Laravix\Cms\Support\FilamentPluginRegistry;
use Laravix\Cms\Support\HydratorRegistry;
use Laravix\Cms\Support\RouteRegistry;

class MyPluginServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        // Filament panel pluginy se musí registrovat brzy:
        FilamentPluginRegistry::register(MyPluginFilamentPlugin::make());
    }

    public function boot(): void
    {
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');
        $this->loadViewsFrom(__DIR__.'/../resources/views', 'my-plugin');
        $this->loadTranslationsFrom(__DIR__.'/../resources/lang', 'my-plugin');

        BlockRegistry::register(MyBlock::definition());
        HydratorRegistry::register(MyHydrator::class);

        RouteRegistry::register(function () {
            Route::get('/my-page', MyController::class)->name('my-plugin.page');
        });
    }
}

Co kam registrovat: jediné tvrdé pravidlo je, že volání FilamentPluginRegistry patří do register() — panel si své pluginy sbírá brzy. Vše ostatní (content typy, typy taxonomií, pole, bloky, routy, hydratory, views, migrace) funguje z boot(); registry se čtou až za requestu. Docs plugin registruje svůj content typ v boot(), jádro své v register() — obojí je v pořádku.

3. Co registry umí

Registr Registrujete Výsledek
ContentTypeRegistry definice content typů Nová sekce pod Obsahem, editační formulář, frontendové vykreslování
TaxonomyTypeRegistry klíč + popisek typu taxonomie Nový typ ve formuláři taxonomie
FieldRegistry definice polí (globální nebo per typ) Pole ve formuláři obsahu
SettingRegistry definice nastavení Pole v záložkách Nastavení
BlockRegistry definice bloků Bloky ve vizuálním builderu
NavigationRegistry definice navigací Další menu na obrazovce Navigace
RouteRegistry closures přidávající routy Frontendové routy uvnitř web middleware skupiny, před CMS catch-all
HydratorRegistry názvy tříd BlockHydrator Post-processing HTML builderu při vykreslení
FilamentPluginRegistry instance Filament Plugin Cokoli, co umí Filament pluginy: resources, pages, widgety

Signatury a příklady ke každému: Přehled registrů.

4. Frontendové stránky

Routy registrované přes RouteRegistry běží před CMS catch-all, takže /my-page vyhraje nad obsahem se slugem my-page. V controllerech znovupoužijte CMS služby jako docs plugin: SiteResolver k nalezení aktuálního webu podle hostname a PageDataBuilder k sestavení standardních view dat, pak vykreslete view — napřed zkuste aktivní šablonu, aby mohly šablony vzhled pluginu přepsat:

$theme = $site->theme ?? 'default';
$view = view()->exists("themes.{$theme}::my-plugin.page")
    ? "themes.{$theme}::my-plugin.page"
    : 'my-plugin::page';

5. Migrace a modely

Pluginy si mohou přivézt vlastní tabulky — Changelog plugin přes loadMigrationsFrom() vytváří changelog_releases a changelog_items. Řádky važte na weby sloupcem site_id, ať zůstanete multi-tenant.

Učte se z reálného kódu

Oba first-party pluginy žijí v monorepu a jsou záměrně malé:

  • packages/laravix/docs-plugin — content typ + typ taxonomie + pole + routy + controllery (bez Filament pluginu, bez migrací).
  • packages/laravix/changelog-plugin — Filament plugin, migrace, modely, builder blok a HTML hydrator.

Související články

Laravix Documentation · 13.07.2026
Star on GitHub