Installation
composer require akyos/blog-bundle
Add to config/bundles.php:
return [
// ...
Akyos\BlogBundle\AkyosBlogBundle::class => ['all' => true],
];
Database Migrations Run:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case: Create a Blog Post
src/Controller/BlogController.php if auto-generated) or extend Akyos\BlogBundle\Controller\BlogController.routing.yml in the bundle):
blog_post:
path: /blog/{slug}
controller: Akyos\BlogBundle\Controller\BlogController::show
Frontend Assets
The bundle uses Webpack Encore. Check assets/blog/ for SCSS/JS templates. Run:
yarn install
yarn build
Post Management
Akyos\BlogBundle\Entity\Post or use as-is.
use Akyos\BlogBundle\Entity\Post;
$post = new Post();
$post->setTitle('Hello World');
$post->setSlug('hello-world');
$post->setContent('...'); // Uses CKEditor (via `friendsofsymfony/ckeditor-bundle`)
$entityManager->persist($post);
Akyos\BlogBundle\Repository\PostRepository for queries.
$recentPosts = $postRepository->findBy([], ['createdAt' => 'DESC'], 5, 0);
Pagination
Leverage knp-paginator-bundle for lists:
use Knp\Component\Pager\PaginatorInterface;
$posts = $paginator->paginate(
$postRepository->findAll(),
$pageNumber,
10
);
Recaptcha Integration
Use karser/recaptcha3-bundle for form submissions:
{{ form_start(postForm) }}
{{ form_widget(postForm) }}
{{ recaptcha3_widget('blog_post') }}
{{ form_end(postForm) }}
Custom Fields
Extend Post with Doctrine extensions (e.g., sluggable, timestampable):
# config/doctrine/orm/beberlei_doctrineextensions.orm.yml
orm:
mappings:
gedmo_timestampable:
type: attribute
prefix: Gedmo\Timestampable\Entity
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Entity"
alias: GedmoTimestampable
is_bundle: false
Fixtures for Development Use AliceDataFixtures to seed posts:
# config/packages/doctrine.yaml
imports:
- { resource: ../fixtures/blog.yml }
Example fixture (config/fixtures/blog.yml):
Akyos\BlogBundle\Entity\Post:
post_{1..10}:
title: '<sentence(5)>'
slug: '<slug>'
content: '<paragraphs(3)>'
published: true
CKEditor Configuration
friendsofsymfony/ckeditor-bundle is configured in config/packages/fos_ckeditor.yaml.fos_ckeditor:
config:
my_config:
toolbar: ['div', '|', 'bold', 'italic']
Slug Generation
beberlei/doctrineextensions for slugs. If slugs fail:
Post entity has @Gedmo\Mapping\Annotation\Slug and setSlug() method.doctrine/orm is configured to use extensions:
doctrine:
orm:
entity_managers:
default:
mappings:
gedmo_sluggable:
type: attribute
prefix: Gedmo\Sluggable\Entity
dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Entity"
alias: GedmoSlugable
Recaptcha Validation
karser_recaptcha3 is enabled in config/packages/karser_recaptcha3.yaml.recaptcha3 field (see bundle docs).Webpack Encore Conflicts
webpack.config.js includes the bundle’s entry points:
Encore
.enableSassLoader()
.addEntry('blog', './assets/blog/app.scss')
.splitEntry('./assets/blog/app.scss')
.enableSingleRuntimeChunk();
yarn watch during development.Doctrine Fixtures Order
Category) aren’t loaded first. Use order in blog.yml:
Akyos\BlogBundle\Entity\Category:
category_{1..3}:
name: '<word>'
Akyos\BlogBundle\Entity\Post:
post_{1..10}:
title: '<sentence(5)>'
category: '@category_*'
Entity Not Found
php bin/console cache:clear
php bin/console doctrine:schema:update --force
Symfony Apache Pack
symfony/apache-pack, ensure .htaccess is deployed:
php bin/console apache-pack:install
Paginator Issues
knp_paginator is configured in config/packages/knp_paginator.yaml:
knp_paginator:
page_range: 5
default_options:
page_name: page
sort_field_name: createdAt
sort_direction_name: direction
distinct: true
Custom Post Types
Post:
use Akyos\BlogBundle\Entity\Post;
class NewsPost extends Post {
// Custom fields/methods
}
Override Templates
vendor/akyos/blog-bundle/Resources/views/ to templates/blog/ in your project.Add Taxonomies
Category entity or create a new one (e.g., Tag). Use many-to-many relations:
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Tag", inversedBy="posts")
*/
private $tags;
API Endpoints
Serializer to expose posts as JSON:
use Symfony\Component\Serializer\SerializerInterface;
$posts = $serializer->serialize($posts, 'json', [
'groups' => ['post:read']
]);
[Groups({"post:read"})] to Post properties for serialization control.How can I help you explore Laravel packages today?