⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.
Reusable Symfony blog kit for multilingual articles, tags, moderated comments, professional listing settings, LinkedIn hashtag sync, and a secured admin CRUD UI composed with UiKit and FormKit.
Compatible with Symfony 7.4+ and 8.x on PHP 8.4+
This bundle is FrankenPHP worker mode friendly.
Blog Kit Bundle gives Symfony applications a reusable blog domain backed by Doctrine. Editors manage articles, tags, and settings in a secured admin UI. Visitors browse a public index and article pages, search and filter by tag, and submit comments that wait for moderation. Hosts can hook BlogArticlePublishedEvent (for example Web Push) and sync trailing LinkedIn hashtags into tags.
- Multilingual articles and tags with locale fallback (
es,enby default) - Public index and article routes at
/blogand/blog/{slug} - Moderated comments with staff replies, configurable rate limits, and CAPTCHA strategies
- Optional article HTML sanitizer (
none,strip,allowlist, or a host service) - Admin CRUD for articles, tags, comments, and singleton blog settings
- Paginated or infinite-scroll listing, configurable asides, and card options
- LinkedIn hashtag formatting command
nowo:blog:sync-hashtags BlogArticlePublishedEventafter an article becomes published- Configurable access:
access_roles, manage / moderate / configure roles, customaccess_checker, and object-level publication rules (security.object_access:none/owner/ hostservice) viaBlogKitAccessDenied - Host CSS stack via
web_ui.css_framework(bootstrap5,tailwind,foundation,custom),icon_set, androw_actions_displaywithout forking page templates - Twig namespace
NowoBlogKitBundlewith host override precedence - Symfony Flex recipe and FrankenPHP demo in
demo/symfony8
composer require nowo-tech/blog-kit-bundle
composer require twig/extra-bundle twig/string-extra# config/packages/nowo_blog_kit.yaml
nowo_blog_kit:
user_class: App\Entity\User
default_locale: es
locales: [es, en]
security:
access_roles: [ROLE_ADMIN]
manage_roles: [ROLE_EDITOR]
moderate_roles: [ROLE_MODERATOR]
configure_roles: [ROLE_ADMIN]
allow_unauthenticated: false
# object_access:
# strategy: owner
web_ui:
layout_template: admin/layout.html.twig
public_layout_template: base.html.twig
css_framework: bootstrap5
icon_set: bootstrap-icons
row_actions_display: icon# config/routes/nowo_blog_kit.yaml
nowo_blog_kit:
resource: '@NowoBlogKitBundle/Resources/config/routing.yaml'php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migratePublic blog: /blog. Admin: /admin/blog, /admin/blog/tags, /admin/blog/comments, /admin/blog/settings.
make up
make test
make phpstan
make -C demo/symfony8 up
make demo-smokeDemo default URL: http://localhost:8105.
- Installation
- Configuration
- PSR evaluation (REQ-CS-007)
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
| Area | Status | Command |
|---|---|---|
PHP src/ coverage target |
100% | make test-coverage-100 |
TS/JS src/Resources/assets |
≥90% | make test-ts |
| Unit and bundle QA | Enabled | make test |
| Full release checks | Enabled | make release-check |
- PHP: 100%
- TS/JS: 100%
- Python: N/A
make test
make test-coverage
make test-coverage-100
make test-ts
make assets
make release-checkMIT — see LICENSE.
