Installation
composer require beelab/simple-page-bundle
Add to config/bundles.php:
BeeLab\SimplePageBundle\BeeLabSimplePageBundle::class => ['all' => true],
Database Migration
Run migrations to create the page table:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case Create a simple page via CLI:
php bin/console bee:page:create --slug="about" --title="About Us" --content="Welcome to our site!"
Access it at /page/about.
Resources/doc/index.md (in the bundle directory).Controller/PageController.php (handles routing).Entity/Page.php (core model).Twig/PageExtension.php (for template integration).Page Creation
bee:page:create).$page = new \BeeLab\SimplePageBundle\Entity\Page();
$page->setSlug('contact');
$page->setTitle('Contact Us');
$page->setContent('<h1>Reach Out</h1>');
$em->persist($page);
$em->flush();
Routing
page/{slug}.config/routes.yaml:
bee_simple_page_page:
path: /custom-path/{slug}
controller: BeeLab\SimplePageBundle\Controller\PageController::showAction
Template Integration
page extension:
{% set currentPage = page('about') %}
{{ currentPage.title }}
{{ currentPage.content|raw }}
{% for page in page.all() %}
<a href="{{ path('bee_simple_page_page_show', {'slug': page.slug}) }}">{{ page.title }}</a>
{% endfor %}
Admin Management
# config/packages/bee_simple_page.yaml
bee_simple_page:
admin:
enabled: true
Custom Fields: Extend the Page entity:
// src/Entity/ExtendedPage.php
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class ExtendedPage extends \BeeLab\SimplePageBundle\Entity\Page
{
#[ORM\Column(type: 'string', nullable: true)]
private $customField;
// Getters/setters...
}
Update the bundle’s PageType (Symfony Form) to include the new field.
Event Listeners: Hook into page events (e.g., PageEvents::PRE_SAVE):
// src/EventListener/PageListener.php
use BeeLab\SimplePageBundle\Event\PageEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PageListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
PageEvents::PRE_SAVE => 'onPreSave',
];
}
public function onPreSave(PageEvent $event)
{
$page = $event->getPage();
$page->setSlug(strtolower($page->getSlug()));
}
}
API Endpoints: Expose pages via API:
// src/Controller/ApiPageController.php
use BeeLab\SimplePageBundle\Entity\Page;
use Symfony\Component\HttpFoundation\JsonResponse;
class ApiPageController extends AbstractController
{
public function show(PageRepository $repo, string $slug): JsonResponse
{
$page = $repo->findOneBy(['slug' => $slug]);
return new JsonResponse($page->toArray());
}
}
Slug Conflicts
setSlug() in your extended entity.Caching Issues
php bin/console cache:clear
config/packages/bee_simple_page.yaml:
bee_simple_page:
cache:
enabled: false
Route Overrides
public function showAction(string $slug): Response
Doctrine Proxy Conflicts
Page entity, regenerate proxies:
php bin/console doctrine:generate:entities BeeLab\SimplePageBundle\Entity
$em->getUnitOfWork()->getEntityState($page); // Returns 1 (managed) or 0 (detached)
# config/packages/dev/doctrine.yaml
doctrine:
dbal:
logging: true
profiling: true
PageSlugValidator service to check slug availability:
$validator = $container->get('bee_simple_page.validator.slug');
if (!$validator->isValid('my-slug')) {
throw new \RuntimeException('Slug already exists!');
}
Custom Repository Methods
Add methods to PageRepository:
// src/Repository/ExtendedPageRepository.php
class ExtendedPageRepository extends \BeeLab\SimplePageBundle\Repository\PageRepository
{
public function findPublished(): array
{
return $this->createQueryBuilder('p')
->where('p.published = :published')
->setParameter('published', true)
->getQuery()
->getResult();
}
}
Update services.yaml to replace the default repository.
Form Type Overrides
Extend the PageType to add fields:
// src/Form/ExtendedPageType.php
use BeeLab\SimplePageBundle\Form\PageType as BasePageType;
class ExtendedPageType extends BasePageType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->add('customField', TextType::class);
}
}
Register the new type in services.yaml.
Twig Filters
Add custom filters to the PageExtension:
// src/Twig/ExtendedPageExtension.php
class ExtendedPageExtension extends \BeeLab\SimplePageBundle\Twig\PageExtension
{
public function getFunctions()
{
return array_merge(parent::getFunctions(), [
new \Twig\TwigFunction('page_excerpt', [$this, 'getExcerpt']),
]);
}
public function getExcerpt(string $content, int $length = 100): string
{
return substr($content, 0, $length) . '...';
}
}
Override the service in services.yaml.
How can I help you explore Laravel packages today?