agence-adeliom/easy-blog-bundle
Basic blogging system for Symfony EasyAdmin. Adds CRUD management for posts and categories, configurable blog root path, and Doctrine schema/migrations support. Compatible with Symfony 6.4/7.x (v3) and PHP 8.2+.
Installation
Run composer require agence-adeliom/easy-blog-bundle in your Symfony project.
Ensure your composer.json includes the custom Flex endpoint for Adeliom recipes.
Database Setup Generate and run migrations:
php bin/console doctrine:migration:diff
php bin/console doctrine:migration:migrate
EasyAdmin Integration
Register the bundle in your config/packages/easy_admin.yaml:
easy_admin:
entities:
- App\Entity\BlogPost
First Use Case
Access /admin to manage blog posts via EasyAdmin’s CRUD interface. The bundle provides a pre-configured BlogPost entity with fields like title, content, slug, and publishedAt.
Entity Management
BlogPost entity (extendable via src/Entity/BlogPost.php).# config/packages/easy_admin.yaml
easy_admin:
entities:
BlogPost:
class: App\Entity\BlogPost
list:
fields: ['title', 'publishedAt', 'tags']
form:
fields: ['title', 'content', 'slug', 'publishedAt', 'tags']
Tagging System
Tag entity (auto-created by the bundle).$post = new BlogPost();
$post->addTag(new Tag('laravel'));
$entityManager->persist($post);
Routing & Frontend
BlogController) for listing posts by tag/slug.config/routes.yaml:
blog_index:
path: /blog
controller: App\Controller\BlogController::index
API Integration (Optional)
# config/packages/api_platform.yaml
resources:
App\Entity\BlogPost:
collectionOperations:
get: ~
actions:
- { name: 'publish', icon: 'fas fa-check', label: 'Publish' }
// src/EventListener/BlogPostListener.php
public function prePersist(BlogPost $post): void
{
$post->setSlug(Str::slug($post->getTitle()));
}
BlogPost entity.Migration Conflicts
BlogPost or Tag entities, delete migrations first to avoid conflicts:
php bin/console doctrine:migrations:diff --delete
App\Entity\BlogPost).EasyAdmin Version Mismatch
easyadmin/easy-admin-bundle version is compatible (check Symfony Packagist).Slug Uniqueness
BlogPost:
/**
* @ORM\Column(type="string", length=255, unique=true)
*/
private $slug;
Tag Auto-Completion
AutocompleteType.Missing Entities in EasyAdmin:
Clear cache and verify easy_admin.yaml:
php bin/console cache:clear
Check for typos in entity class names (e.g., App\Entity\BlogPost vs. App\Entity\Post).
Database Errors:
Run php bin/console doctrine:schema:validate to check schema consistency.
Custom Fields
Add fields to BlogPost and update EasyAdmin’s CRUD:
// src/Entity/BlogPost.php
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $featuredImage;
# easy_admin.yaml
form:
fields: ['featuredImage', 'title', ...]
Override Controllers
Replace the default BlogController by copying src/Controller/BlogController.php to your project and updating routes.
Add Validation
Extend BlogPost with constraints:
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Assert\NotBlank
* @Assert\Length(max=500)
*/
private $content;
Localization
Translate labels in translations/easy_admin.en.yaml:
blog_post:
label: 'Blog Post'
title: 'Title'
gedmo/doctrine-extensions for soft-deleted posts:
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
*/
class BlogPost { ... }
KnpLabs\DoctrineBehaviors for publishedAt and slug behaviors to reduce boilerplate.BlogPost entity in PHPUnit:
$post = $this->createMock(BlogPost::class);
$post->method('getTitle')->willReturn('Test Post');
How can I help you explore Laravel packages today?