v0.5.0
<p>Git history moves into core, addons are referenced by alias and mounted from config, and the global helper functions become template functions.</p>
30 September 2026
Added
App::history(): git-backed drafts, publish and revisions are now core.History,RevisionandDeployKeylive inphlat/src/History/, replacing thephlat/gitaddon.isAvailable()is true whendata/is inside a git repo, andrequire()throws a 404 for routes that need one.- Addons declare where their
pages/tree mounts in config:"phlat/admin": {"mount": "admin"}. The mount page no longer has to exist indata/pages/, and a real page at the same slug still takes precedence.phlat/addons/clockwork/pages/index.jsonships a mount page for Clockwork. App::addonConfig($id, $key)and theaddon()template function read an addon's own settings from itsaddons.{id}config entry.App::beginRequest()is the single place per-request state is reset under a persistent worker, and it emitsapp.request:beforeso addons can reset their own.Registry::reset()clears the registry's per-request memos, which previously lived for the whole worker.PageFiles::serveRequest()andPageFiles::ownerUrl().FieldValue::withValue(),FieldValue::editTemplate()andFieldTypeCollection::count(), so edit templates no longer reach forapp().- Template functions
p(),find(),session(),permission(),config()andaddon(), registered inLatteExtension, along with thehxalias. - The
repeaterfieldtype: an ordered list of rows sharing one shape (options.fields), each row readable in templates like a mini page. - Class docs in the admin docs reference, and tree highlighting that follows preview navigation.
phlat/Dockerfile.fpm,phlat/Caddyfile.fpmand adocker:publish-dev:fpmtask for a php-fpm image alongside the FrankenPHP worker setup.declare(strict_types=1)in every PHP file underphlat/.
Changed
- Addons are referenced by alias only:
@admin/login,@ui/button. Two addons that resolve to the same alias now throw at load.AddonRegistryis keyed by alias and dropsresolveRef,resolveTemplateRef,idFor,aliasOfandprefixes. AddonPageview and controller overrides now live atviews/@alias/, matching template overrides. They previously used the full addon id.App::addons()returnsalias => root path.phlat/config.jsonmountsphlat/adminatadminandphlat/clockworkat__clockwork.?rev=is handled byHistory::pageAt()and the auto-commit hook is registered inregisterCoreHooks(). The admin gates history and Changes onisAvailable()instead of a nullmake('git').fresh()is the only invalidation for field, view and fieldtype-meta caches. It compares mtime and size, so a same-second save still invalidates.- Item and user files are plain
PageFileandPageImageinstances carrying aparentUuid.ItemFile,ItemImage,UserFile,UserImage,ResolvesItemUrlandResolvesUserUrlare removed. - File serving moved out of
Page::route()intoPageFiles::serveRequest(), andApp::execute()renders errors through a privaterenderError(). - Admin login stores its flash message in the page-scoped session.
DirectSessionAccessRulenow only flags direct$app->sessiondata access. FieldTypeNumberreturnsnullfor a stored non-numeric value instead of throwing.phlat/src/README.mdandphlat/src/Toolkit/README.mddescribe the current design and list every Toolkit class.
Removed
- The
phlat/gitaddon,phlat/functions.php,phlat/index.phpandphlat/addons/admin/index.php. - Global
app(),page(),query(),q(),session(),s(),find(),permission()andmake(). Use$app->page(),$app->request->query(),$page->session()and$app->find()in PHP, and the template functions above in Latte. Templates no longer haveapp(). App::forgetField(),forgetView(),fieldtypeFields(),addon()andaddonSession(), and the addon$sessionargument.App::bind()no longer registers a service under the loading addon's id and alias; use the name you pass.phlat/pagesas a page source, andPage::isSystem().Registry::indexAddon()andRegistry::addonPages().
Fixed
phlat/views/errors/index.lattecalled the removedf()helper, so every error page fell back to bare HTML. It now renders through the template.
Comments
No comments yet. Be the first!
Loading form…