{% extends layout %} {% import '_layout/icons.twig' as icons %} {% block title %}Hello, World!{% endblock %} {% block description %}The first post on this blog — a plain sidecar-less page, like every other post here now.{% endblock %} {% block robots %}index, follow{% endblock %} {% block tags %}welcome, meta{% endblock %} {% block canonical %}{{ request_path|default('/') }}{% endblock %} {% block og_type %}article{% endblock %} {% block og_title %}{{ block('title') }}{% endblock %} {% block og_description %}{{ block('description') }}{% endblock %} {% block og_url %}{{ block('canonical') }}{% endblock %} {% block twitter_card %}summary{% endblock %} {% block twitter_title %}{{ block('title') }}{% endblock %} {% block twitter_description %}{{ block('description') }}{% endblock %} {% block blog_content %}

Hello, World!

The first post on this blog — a plain page at App/pages/blog/hello-world/index.twig, sidecar-less like {{ icons.book() }}the Twig Syntax Guide and the {{ icons.book() }}Style Guide. Since it has no sidecar, it's rendered once and served as static HTML from public/cache/blog/hello-world/index.html on every later request — see {{ icons.book() }}Static caching.

This URL used to be backed by a wildcard App/pages/blog/[slug]/ route pulling from a Lib\PostRepository class — a live demo of route-param capture. That mechanism (any single URL segment captured into $params) is still fully supported by the framework; see {{ icons.link() }}Routing. It just isn't what renders this particular post anymore, now that this post is fixed content rather than a stand-in for arbitrary slugs.

{% endblock %}