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.