Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Blog Bundle Laravel Package

ed/blog-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps to First Use

  1. Install Dependencies

    composer require ed/blog-bundle
    composer require friendsofsymfony/user-bundle knplabs/knp-paginator-bundle stof/doctrine-extensions-bundle sonata-project/media-bundle
    
  2. Enable Bundles Add to config/bundles.php:

    EtonDigital\EDBlogBundle\EDBlogBundle::class => ['all' => true],
    
  3. Run Migrations

    php bin/console doctrine:migrations:diff
    php bin/console doctrine:migrations:migrate
    
  4. Configure Routes Import routing in config/routes.yaml:

    ed_blog:
        resource: "@EDBlogBundle/Resources/config/routing.yml"
        prefix: /blog
    
  5. First Admin Panel Access Navigate to /blog/admin (ensure FOSUserBundle is configured with an admin user).

First Use Case: Publishing an Article

  1. Log in as an Author or Editor.
  2. Navigate to Articles > Add New.
  3. Fill in title, content, and select a category/tag.
  4. Click Save (autosave enabled by default).
  5. Publish via the Publish button.

Implementation Patterns

Core Workflows

1. Article Management

  • Revisions: Use the Revisions tab to track changes. Restore via the dropdown.
  • Writing Locks: Enable in config (ed_blog.lock_enabled: true) to prevent concurrent edits.
  • Autosave: Configure interval in ed_blog.autosave_interval (default: 300s).

2. Media Integration

  • Upload images via Media Gallery (SonataMediaBundle integration).
  • Embed media in articles using the WYSIWYG editor (TinyMCE by default).
  • Configure allowed media providers in config/packages/ed_blog.yaml:
    ed_blog:
        media:
            providers: [sonata.media.provider.image, sonata.media.provider.file]
    

3. User Roles & Permissions

  • Assign roles via FOSUserBundle (ROLE_CONTRIBUTOR, ROLE_AUTHOR, ROLE_EDITOR, ROLE_ADMIN).
  • Customize permissions in ed_blog.security.yml:
    access_control:
        - { path: ^/blog/admin, roles: ROLE_ADMIN }
        - { path: ^/blog/article/new, roles: ROLE_AUTHOR }
    

4. RSS Feed

  • Enable via config:
    ed_blog:
        rss:
            enabled: true
            limit: 10
    
  • Access feed at /blog/rss.

5. Pagination

  • Use KnpPaginatorBundle for article lists:
    use Knp\Component\Pager\PaginatorInterface;
    
    $articles = $paginator->paginate(
        $this->getDoctrine()->getRepository(Article::class)->findAll(),
        $pageNumber, 10
    );
    

Integration Tips

  • Custom Templates: Override bundle templates in templates/EDBlogBundle/ (e.g., article/show.html.twig).
  • Event Listeners: Extend functionality via events (e.g., ed_blog.article.pre_publish):
    // src/EventListener/ArticleListener.php
    public function onPrePublish(ArticleEvent $event) {
        $article = $event->getArticle();
        $article->setSeoTitle($this->generateSeoTitle($article));
    }
    
  • API Access: Use Symfony’s serializer to expose articles as JSON:
    $article = $this->getDoctrine()->getRepository(Article::class)->find($id);
    return $this->json($this->serializer->serialize($article, 'json'));
    

Gotchas and Tips

Pitfalls

  1. FOSUserBundle Dependency

    • If FOSUserBundle is misconfigured, the admin panel will fail. Ensure:
      • fos_user is enabled in bundles.php.
      • Users are properly registered with roles (e.g., ROLE_ADMIN).
    • Fix: Run php bin/console fos:user:create to create an admin user.
  2. Doctrine Extensions Conflict

    • StofDoctrineExtensionsBundle may cause issues if other bundles use the same extensions (e.g., Sluggable).
    • Fix: Explicitly configure extensions in config/packages/doctrine.yaml:
      doctrine:
          orm:
              entity_managers:
                  default:
                      mappings:
                          StofDoctrineExtensionsBundle: ~
      
  3. Media Upload Limits

    • SonataMediaBundle may reject large files by default. Adjust in config/packages/sonata_media.yaml:
      sonata_media:
          providers:
              sonata.media.provider.image:
                  max_filesize: 10M
      
  4. Autosave Overhead

    • Frequent autosaves can bloat the database. Monitor ed_blog_article_revision table size.
    • Tip: Increase autosave_interval or disable for high-traffic sites.
  5. Routing Conflicts

    • The bundle’s routes may clash with existing routes (e.g., /blog vs. /posts).
    • Fix: Override routes in config/routes/ed_blog.yaml:
      ed_blog_article:
          resource: "@EDBlogBundle/Resources/config/routing/article.yml"
          prefix: /posts
      

Debugging Tips

  • Enable Debug Mode: Set APP_DEBUG=1 in .env to see detailed errors.
  • Check Logs: Review var/log/dev.log for bundle-specific issues (e.g., media upload errors).
  • SQL Queries: Use Doctrine’s query logging:
    # config/packages/dev/doctrine.yaml
    doctrine:
        dbal:
            logging: true
            profiling: true
    

Extension Points

  1. Custom Fields Add fields to Article via Doctrine extensions:

    // src/Entity/Article.php
    use Gedmo\Mapping\Annotation as Gedmo;
    
    /**
     * @Gedmo\Slug(fields={"title"})
     */
    private $slug;
    
  2. Plugin System Extend the bundle’s controller logic by overriding services:

    # config/services.yaml
    services:
        ed_blog.article_controller:
            class: App\Controller\CustomArticleController
            arguments: ['@ed_blog.article_manager']
            tags: ['controller.service_arguments']
    
  3. Custom Validators Add validation to articles (e.g., minimum word count):

    // src/Validator/Constraints/ArticleValidator.php
    use Symfony\Component\Validator\Constraint;
    use Symfony\Component\Validator\ConstraintValidator;
    
    class ArticleValidator extends ConstraintValidator {
        public function validate($article, Constraint $constraint) {
            $wordCount = str_word_count($article->getContent());
            if ($wordCount < 100) {
                $this->context->buildViolation($constraint->message)
                    ->addViolation();
            }
        }
    }
    
  4. API Endpoints Create a custom API controller to fetch articles:

    // src/Controller/Api/ArticleController.php
    use Symfony\Component\Routing\Annotation\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    
    class ArticleController extends AbstractController {
        /**
         * @Route("/api/articles", name="api_articles", methods={"GET"})
         */
        public function listArticles() {
            $articles = $this->getDoctrine()->getRepository(Article::class)->findBy([], ['publishedAt' => 'DESC']);
            return $this->json($articles);
        }
    }
    

Configuration Quirks

  • Timezone Handling: Ensure framework.default_locale and framework.timezone are set in .env to avoid datetime issues.
  • Cache Warmup: Run php bin/console cache:warmup after extending templates or services.
  • Asset Versioning: Disable asset versioning if using custom JS/CSS:
    # config/packages/twig.yaml
    twig:
        strict_variables: true
        globals:
            ed_blog_asset_version: '1.0'
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager