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

Product Cms Bundle Laravel Package

dywee/product-cms-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps to First Use

  1. Installation Add the bundle to your composer.json:

    composer require dywee/product-cms-bundle
    

    Enable it in config/bundles.php:

    return [
        // ...
        Dywee\ProductCmsBundle\DyweeProductCmsBundle::class => ['all' => true],
    ];
    
  2. Database Setup Run migrations (check src/Resources/migrations/ for schema):

    php bin/console doctrine:migrations:migrate
    
  3. First Product Create a product via CLI or admin interface (if available):

    php bin/console dywee:product:create --name="Test Product" --price=19.99
    
  4. Basic Usage in Controller Fetch and display a product:

    use Dywee\ProductCmsBundle\Entity\Product;
    
    public function show(Product $product) {
        return $this->render('product/show.html.twig', [
            'product' => $product,
        ]);
    }
    
  5. Routing Ensure routes are imported in config/routes.yaml:

    dywee_product_cms:
        resource: "@DyweeProductCmsBundle/Resources/config/routing.yml"
    

Implementation Patterns

Core Workflows

  1. Product Management

    • CRUD via Admin: Use the bundle’s built-in admin interface (if enabled) or extend it with EasyAdmin.
    • Programmatic CRUD:
      // Create
      $product = new Product();
      $product->setName('Laptop');
      $product->setPrice(999.99);
      $em->persist($product);
      $em->flush();
      
      // Fetch
      $product = $em->getRepository(Product::class)->findOneBy(['slug' => 'laptop']);
      
  2. Product Attributes

    • Use ProductAttribute entity for custom fields (e.g., weight, dimensions):
      $attribute = new ProductAttribute();
      $attribute->setName('weight');
      $attribute->setValue('2.5kg');
      $product->addAttribute($attribute);
      
  3. Categories & Taxonomy

    • Hierarchical categories via ProductCategory:
      $category = new ProductCategory();
      $category->setName('Electronics');
      $product->addCategory($category);
      
  4. Inventory & Stock

    • Track stock levels with ProductStock:
      $stock = new ProductStock();
      $stock->setQuantity(100);
      $product->setStock($stock);
      
  5. API Integration

    • Expose products via API Platform or custom API:
      # config/api_platform/resources.yaml
      resources:
          Dywee\ProductCmsBundle\Entity\Product:
              collectionOperations:
                  - GET
              itemOperations:
                  - GET
      

Integration Tips

  1. Symfony Forms Integrate with Symfony Forms for admin panels:

    use Dywee\ProductCmsBundle\Form\Type\ProductType;
    
    $form = $this->createForm(ProductType::class, $product);
    
  2. Event Listeners Extend functionality with events (e.g., ProductEvents::PRE_SAVE):

    // src/EventListener/ProductListener.php
    public function onPreSave(ProductEvent $event) {
        $product = $event->getProduct();
        $product->setSlug(Str::slug($product->getName()));
    }
    
  3. Custom Repositories Override default repositories for complex queries:

    // src/Repository/ProductRepository.php
    public function findByPriceRange(float $min, float $max): array {
        return $this->createQueryBuilder('p')
            ->where('p.price BETWEEN :min AND :max')
            ->setParameter('min', $min)
            ->setParameter('max', $max)
            ->getQuery()
            ->getResult();
    }
    
  4. Doctrine Lifecycle Callbacks Use @ORM\PrePersist in entities for automation:

    use Doctrine\ORM\Mapping as ORM;
    
    #[ORM\Entity]
    class Product {
        #[ORM\PrePersist]
        public function setSlug(): void {
            $this->slug = Str::slug($this->name);
        }
    }
    
  5. Translation Support Enable translations for product fields (e.g., name, description):

    # config/packages/doctrine.yaml
    orm:
        translations:
            Dywee\ProductCmsBundle\Entity\Product:
                name: ~
                description: ~
    

Gotchas and Tips

Pitfalls

  1. Missing Doctrine Migrations

    • Issue: Forgetting to run migrations after installation.
    • Fix: Always run php bin/console doctrine:migrations:migrate post-install.
  2. Entity Naming Conflicts

    • Issue: Namespace collisions if using similar entity names (e.g., Product).
    • Fix: Alias entities in config/packages/doctrine.yaml:
      orm:
          entity_managers:
              default:
                  mappings:
                      dywee_product:
                          alias: DyweeProduct
                          is_bundle: false
      
  3. Admin Interface Dependencies

    • Issue: The bundle may assume SonataAdmin or similar is installed.
    • Fix: Disable unused admin routes or install dependencies explicitly.
  4. Slug Generation

    • Issue: Default slug generation may not handle Unicode or special characters.
    • Fix: Override slug logic in a listener or entity callback.
  5. Performance with Large Catalogs

    • Issue: N+1 queries when fetching products with categories/attributes.
    • Fix: Use DQL or QueryBuilder with JOIN FETCH:
      $qb = $em->createQueryBuilder()
          ->select('p, c')
          ->from(Product::class, 'p')
          ->leftJoin('p.categories', 'c');
      

Debugging Tips

  1. Enable SQL Logging

    # config/packages/dev/doctrine.yaml
    doctrine:
        dbal:
            logging: true
            profiling: true
    
  2. Check Event Dispatching

    • Verify events are fired by adding a debug listener:
      public function onKernelEvent(GetResponseEvent $event) {
          $this->container->get('debug.stopwatch')->lap('product_event');
      }
      
  3. Validate Entity States

    • Use Symfony’s validator for entity constraints:
      $errors = $validator->validate($product);
      if (count($errors) > 0) {
          throw new \RuntimeException((string) $errors);
      }
      

Extension Points

  1. Custom Product Types

    • Extend Product entity or use inheritance:
      class DigitalProduct extends Product {
          #[ORM\Column(type: 'string')]
          private $licenseKey;
      }
      
  2. Dynamic Attributes

    • Add a ProductAttributeType entity to support custom attribute types (e.g., dropdown, checkbox).
  3. Multi-Store Support

    • Extend with ProductStore entity for store-specific configurations:
      class ProductStore {
          #[ORM\ManyToOne]
          private $store;
      
          #[ORM\ManyToOne(targetEntity: Product::class, inversedBy: 'stores')]
          private $product;
      }
      
  4. API Filtering

    • Integrate with API Platform’s filters for product listings:
      # config/api_platform/resources.yaml
      Dywee\ProductCmsBundle\Entity\Product:
          properties:
              price: ~
              name: ~
          filters: ['search', 'range']
      
  5. Webhooks for Inventory

    • Dispatch events when stock levels change:
      public function onStockUpdate(ProductEvent $event) {
          $this->dispatchWebhook('stock_updated', $event->getProduct());
      }
      
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.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
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