Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions public/llms-full.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ keywords: ["headless platform", "PHP", "Mezzio", "Laminas", "PSR-15 middleware",

## TL;DR

Dotkernel is a collection of open-source PHP application skeletons built on Mezzio and Laminas, licensed BSD-3-Clause.
Dotkernel is a collection of open-source PHP application skeletons built on Mezzio and Laminas, licensed MIT.
Its headless platform combines three components — **API**, **Admin**, and **Queue** — that can be adopted separately or together.
Two additional skeletons, **Light** and **Frontend**, stand outside the platform for simpler or frontend-only use cases.

Expand All @@ -44,7 +44,7 @@ Two additional skeletons, **Light** and **Frontend**, stand outside the platform
|---|---|
| Runtime | Mezzio + Laminas |
| Standards | PSR-7, PSR-11, PSR-15 |
| License | BSD-3-Clause |
| License | MIT |
| Router | FastRoute |
| Response | Diactoros |
| Maintainer | Apidemia |
Expand Down
4 changes: 2 additions & 2 deletions public/md-articles/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ keywords: ["headless platform", "PHP", "Mezzio", "Laminas", "PSR-15 middleware",

## TL;DR

Dotkernel is a collection of open-source PHP application skeletons built on Mezzio and Laminas, licensed BSD-3-Clause.
Dotkernel is a collection of open-source PHP application skeletons built on Mezzio and Laminas, licensed MIT.
Its headless platform combines three components — **API**, **Admin**, and **Queue** — that can be adopted separately or together.
Two additional skeletons, **Light** and **Frontend**, stand outside the platform for simpler or frontend-only use cases.

Expand All @@ -40,7 +40,7 @@ Two additional skeletons, **Light** and **Frontend**, stand outside the platform
|---|---|
| Runtime | Mezzio + Laminas |
| Standards | PSR-7, PSR-11, PSR-15 |
| License | BSD-3-Clause |
| License | MIT |
| Router | FastRoute |
| Response | Diactoros |
| Maintainer | Apidemia |
Expand Down
73 changes: 55 additions & 18 deletions src/App/templates/JSON-LD/index.jsonld.twig
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
{% set organizationId = app.baseUrl ~ '/#organization' %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "{{ absolute_url('/') }}#website ",
"url": "{{ absolute_url('/') }}",
"@id": {{ (app.baseUrl ~ '/#website')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": {{ (app.baseUrl ~ '')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel",
"description": "Dotkernel is a collection of open-source application skeletons built on Mezzio and Laminas - pre-configured and ready for anything from a presentation site to an enterprise-grade API.",
"description": {{ 'Dotkernel is a collection of open-source application skeletons built on Mezzio and Laminas - pre-configured and ready for anything from a presentation site to an enterprise-grade API.'|json_encode|raw }},
"publisher": {
"@id": "{{ absolute_url('/') }}#organization"
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
}
},
{
"@type": "Organization",
"@id": "{{ absolute_url('/') }}#organization",
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel",
"url": "{{ absolute_url('/') }}",
"logo": "{{ absolute_url(asset('images/app/dotkernel-logo.png')) }}",
"url": {{ (app.baseUrl ~ '')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"logo": {{ (app.baseUrl ~ asset('images/app/logo.png'))|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"sameAs": [
"https://github.com/dotkernel",
"https://www.dotkernel.com"
"https://packagist.org/packages/dotkernel/",
"https://x.com/dotkernel"
],
"parentOrganization": {
"@type": "Organization",
Expand All @@ -30,12 +32,19 @@
},
{
"@type": "SoftwareApplication",
"@id": {{ (app.baseUrl ~ '/#api')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel API",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"description": "A framework-less, opinionated toolkit for intermediate-to-advanced developers who want to ship REST APIs quickly and efficiently. An alternative to legacy Laminas API Tools (Apigility).",
"description": {{ 'REST APIs on a readable PSR-15 middleware pipeline - no kernel, no facades, no runtime magic. OAuth2, RBAC, and OpenAPI included.'|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": "https://github.com/dotkernel/api",
"license": "https://opensource.org/licenses/BSD-3-Clause",
"license": "https://opensource.org/licenses/MIT",
"author": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"publisher": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"offers": {
"@type": "Offer",
"price": "0",
Expand All @@ -44,12 +53,19 @@
},
{
"@type": "SoftwareApplication",
"@id": {{ (app.baseUrl ~ '/#admin')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel Admin",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"description": "A ready-to-go admin skeleton for managing your platform's records with a simple, table-based approach - plus the tools to build reports and dashboards.",
"description": {{ "A ready-to-go admin skeleton for managing your platform's records with a simple, table-based approach - plus the tools to build reports and dashboards."|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": "https://github.com/dotkernel/admin",
"license": "https://opensource.org/licenses/BSD-3-Clause",
"license": "https://opensource.org/licenses/MIT",
"author": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"publisher": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"offers": {
"@type": "Offer",
"price": "0",
Expand All @@ -58,12 +74,19 @@
},
{
"@type": "SoftwareApplication",
"@id": {{ (app.baseUrl ~ '/#queue')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel Queue",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"description": "Asynchronous task queuing built on Symfony Messenger, wired into the Laminas Service Manager container via netglue/laminas-messenger.",
"description": {{ 'Asynchronous task queuing built on Symfony Messenger, wired into the Laminas Service Manager container via netglue/laminas-messenger.'|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": "https://github.com/dotkernel/queue",
"license": "https://opensource.org/licenses/BSD-3-Clause",
"license": "https://opensource.org/licenses/MIT",
"author": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"publisher": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"offers": {
"@type": "Offer",
"price": "0",
Expand All @@ -72,12 +95,19 @@
},
{
"@type": "SoftwareApplication",
"@id": {{ (app.baseUrl ~ '/#light')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel Light",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"description": "A minimal, PSR-15 compliant skeleton built for learning purposes - a simple, didactic example of how to put together a basic website.",
"description": {{ 'The smallest complete Mezzio application - PSR-15 pipeline, routing, and templating, nothing to strip out. A real starting point for a simple site.'|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": "https://github.com/dotkernel/light",
"license": "https://opensource.org/licenses/BSD-3-Clause",
"license": "https://opensource.org/licenses/MIT",
"author": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"publisher": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"offers": {
"@type": "Offer",
"price": "0",
Expand All @@ -86,12 +116,19 @@
},
{
"@type": "SoftwareApplication",
"@id": {{ (app.baseUrl ~ '/#frontend')|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"name": "Dotkernel Frontend",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "Cross-platform",
"description": "A web starter skeleton for building frontend applications on Mezzio and Laminas - a standalone alternative, separate from the Headless Platform.",
"description": {{ 'A web starter skeleton for building frontend applications on Mezzio and Laminas - a standalone alternative, separate from the Headless Platform.'|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }},
"url": "https://github.com/dotkernel/frontend",
"license": "https://opensource.org/licenses/BSD-3-Clause",
"license": "https://opensource.org/licenses/MIT",
"author": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"publisher": {
"@id": {{ organizationId|json_encode(constant('JSON_UNESCAPED_SLASHES'))|raw }}
},
"offers": {
"@type": "Offer",
"price": "0",
Expand Down
2 changes: 1 addition & 1 deletion src/App/templates/app/index.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<div class="hero-stack-note">
<div><span>Runtime</span> Mezzio + Laminas</div>
<div><span>Standards</span> PSR-7 · PSR-11 · PSR-15</div>
<div><span>License</span> BSD-3-Clause</div>
<div><span>License</span> MIT</div>
</div>
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,45 @@
"@graph": [
{
"@type": "TechArticle",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#article",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}#article/",
"headline": {{ article.title|json_encode|raw }},
"description": {{ article.excerpt|json_encode|raw }},
"url": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}",
"mainEntityOfPage": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}",
"url": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"mainEntityOfPage": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"datePublished": "{{ article.postDate|date('c') }}",
"dateModified": "{{ article.postDate|date('c') }}",
"image": "{{ app.meta.image }}",
"image": "{{ meta.openGraphImage ? app.baseUrl ~ meta.openGraphImage : app.meta.image }}",
"articleSection": {{ article.category.name|json_encode|raw }},
"author": {
"@type": "Person",
"name": {{ article.author.name|json_encode|raw }},
"url": "{{ absolute_url(path('page::author-resource', {slug: article.author.slug})) }}"
"url": "{{ app.baseUrl ~ path('page::author-resource', {slug: article.author.slug}) }}"
},
"publisher": {
"@type": "Organization",
"name": "Dotkernel",
"url": "{{ absolute_url('/') }}",
"url": "{{ app.baseUrl }}",
"logo": {
"@type": "ImageObject",
"url": "{{ absolute_url(asset('images/app/dotkernel-logo.png')) }}"
"url": "{{ app.baseUrl ~ asset('images/app/logo.png') }}"
}
}
},
{
"@type": "BreadcrumbList",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#breadcrumb",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}#breadcrumb/",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "{{ absolute_url('/') }}"
"item": "{{ app.baseUrl }}"
},
{
"@type": "ListItem",
"position": 2,
"name": {{ article.category.name|json_encode|raw }},
"item": "{{ absolute_url(path('page::category-resource', {slug: article.category.slug})) }}"
"item": "{{ app.baseUrl ~ path('page::category-resource', {slug: article.category.slug}) }}"
},
{
"@type": "ListItem",
Expand All @@ -53,7 +53,7 @@
},
{
"@type": "FAQPage",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#faq",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"mainEntity": [
{
"@type": "Question",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,42 @@
"@graph": [
{
"@type": "TechArticle",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#article",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}#article/",
"headline": {{ article.title|json_encode|raw }},
"description": {{ article.excerpt|json_encode|raw }},
"url": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}",
"mainEntityOfPage": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}",
"url": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"mainEntityOfPage": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"datePublished": "{{ article.postDate|date('c') }}",
"dateModified": "{{ article.postDate|date('c') }}",
"image": "{{ app.meta.image }}",
"image": "{{ meta.openGraphImage ? app.baseUrl ~ meta.openGraphImage : app.meta.image }}",
"articleSection": {{ article.category.name|json_encode|raw }},
"author": {
"@type": "Person",
"name": {{ article.author.name|json_encode|raw }},
"url": "{{ absolute_url(path('page::author-resource', {slug: article.author.slug})) }}"
"url": "{{ app.baseUrl ~ path('page::author-resource', {slug: article.author.slug}) }}"
},
"publisher": {
"@type": "Organization",
"name": "Dotkernel",
"url": "{{ absolute_url('/') }}",
"url": "{{ app.baseUrl }}",
"logo": {
"@type": "ImageObject",
"url": "{{ absolute_url(asset('images/app/dotkernel-logo.png')) }}"
"url": "{{ app.baseUrl ~ asset('images/app/logo.png') }}"
}
}
},
{
"@type": "BreadcrumbList",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#breadcrumb",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}#breadcrumb/",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "{{ absolute_url('/') }}" },
{ "@type": "ListItem", "position": 2, "name": {{ article.category.name|json_encode|raw }}, "item": "{{ absolute_url(path('page::category-resource', {slug: article.category.slug})) }}" },
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "{{ app.baseUrl }}" },
{ "@type": "ListItem", "position": 2, "name": {{ article.category.name|json_encode|raw }}, "item": "{{ app.baseUrl ~ path('page::category-resource', {slug: article.category.slug}) }}" },
{ "@type": "ListItem", "position": 3, "name": {{ article.title|json_encode|raw }} }
]
},
{
"@type": "FAQPage",
"@id": "{{ absolute_url(path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug})) }}#faq",
"@id": "{{ app.baseUrl ~ path('page::blog-resource', {categorySlug: article.category.slug, slug: article.slug}) }}",
"mainEntity": [
{
"@type": "Question",
Expand Down
Loading