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

Drom Products Laravel Package

baks-dev/drom-products

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation

    composer require baks-dev/drom-products
    

    Verify php -v is 8.4+ and baks-dev/core (≥7.4) is installed.

  2. Publish Config

    php artisan vendor:publish --provider="BaksDev\DromProducts\DromProductsServiceProvider" --tag="config"
    

    Locate config/drom-products.php for default settings (e.g., API endpoints, locale).

  3. Register Service Provider Add to config/app.php:

    BaksDev\DromProducts\DromProductsServiceProvider::class,
    
  4. First Use Case: Product CRUD Use the facade to interact with products:

    use BaksDev\DromProducts\Facades\DromProducts;
    
    // Create a product
    $product = DromProducts::product()->create([
        'name' => 'Test Product',
        'sku' => 'SKU123',
        'price' => 1000.00,
        'currency' => 'RUB',
    ]);
    
    // Fetch a product
    $product = DromProducts::product()->find($product->id);
    
    // List products (with pagination)
    $products = DromProducts::product()->paginate(10);
    
  5. Verify Database Check the products table (or custom schema defined in config) for entries.


Implementation Patterns

Core Workflows

1. Product Management

  • Create/Update:
    $product = DromProducts::product()->updateOrCreate(
        ['sku' => 'SKU123'],
        ['name' => 'Updated Name', 'price' => 1500.00]
    );
    
  • Bulk Operations:
    $products = DromProducts::product()->whereIn('id', [1, 2, 3])->update(['status' => 'archived']);
    

2. Variants and SKUs

Use the variant() method to manage product variants:

$variant = DromProducts::product()->find(1)->variant()->create([
    'sku' => 'VARIANT-SKU',
    'attributes' => ['color' => 'red', 'size' => 'M'],
]);

3. Inventory Tracking

Leverage the inventory() method for batch/serial numbers:

$inventory = DromProducts::inventory()->create([
    'product_id' => 1,
    'batch_number' => 'BATCH-2024',
    'quantity' => 50,
]);

4. API Integration (Drom-Specific)

Configure API endpoints in config/drom-products.php:

'api' => [
    'base_url' => 'https://api.drom.ru/v1',
    'auth_token' => env('DROM_API_TOKEN'),
],

Sync with Drom’s marketplace:

$externalProducts = DromProducts::api()->fetchProducts();

5. Events and Observers

Listen to product events (e.g., ProductCreated):

DromProducts::product()->on('created', function ($product) {
    // Send notification or log
});

Integration Tips

Laravel-Symfony Bridge

  • Service Container: Bind Symfony services to Laravel’s container in AppServiceProvider:
    public function register()
    {
        $this->app->singleton(\BaksDev\DromProducts\Services\ProductService::class);
    }
    
  • Doctrine to Eloquent: Use doctrine/dbal for shared queries or rewrite models:
    class Product extends Model
    {
        protected $connection = 'drom_products'; // Custom DB connection
    }
    

API Layer

  • Wrap Bundle Routes: Create a Laravel controller to proxy bundle logic:
    Route::get('/products', [ProductController::class, 'index']);
    
    class ProductController extends Controller
    {
        public function index()
        {
            return response()->json(DromProducts::product()->paginate(10));
        }
    }
    

Testing

  • PHPUnit Groups: Run bundle tests in isolation:
    php bin/phpunit --group=drom-products
    
  • Mock Symfony Services: Use Laravel’s Mockery to test adapters:
    $mockService = Mockery::mock(\BaksDev\DromProducts\Services\ProductService::class);
    $this->app->instance(\BaksDev\DromProducts\Services\ProductService::class, $mockService);
    

Gotchas and Tips

Pitfalls

  1. Symfony Dependency Injection (DI)

    • Issue: Bundle may use Symfony’s ContainerInterface directly.
    • Fix: Create a Laravel-compatible adapter:
      class LaravelContainerAdapter implements \Psr\Container\ContainerInterface
      {
          public function get($id)
          {
              return app($id);
          }
      }
      
  2. Doctrine ORM Conflicts

    • Issue: Eloquent and Doctrine may clash if both are autoloaded.
    • Fix: Exclude Doctrine’s EntityManager from Laravel’s autoloader or use a separate DB connection.
  3. Russian-Specific Logic

    • Issue: Tax rules, currency (RUB), or Drom-specific validations may not apply globally.
    • Fix: Override validation rules in AppServiceProvider:
      DromProducts::product()->extend(function ($builder) {
          $builder->validatePriceInRUB();
      });
      
  4. API Rate Limits

    • Issue: Drom’s API may throttle requests.
    • Fix: Implement caching for external API calls:
      $products = Cache::remember('drom_products', 3600, function () {
          return DromProducts::api()->fetchProducts();
      });
      
  5. Migration Conflicts

    • Issue: Bundle migrations may conflict with existing Laravel migrations.
    • Fix: Use a custom migration table or prefix:
      Schema::create('drom_products', function (Blueprint $table) { ... });
      

Debugging Tips

  1. Enable Bundle Logging Add to config/drom-products.php:

    'debug' => env('APP_DEBUG', false),
    

    Check logs at storage/logs/drom-products.log.

  2. Symfony Profiler If using Symfony’s DebugBundle, dump variables:

    \Symfony\Component\Debug\Debug::dump($product);
    
  3. SQL Queries Use Laravel’s query logging:

    DB::enableQueryLog();
    $products = DromProducts::product()->all();
    dd(DB::getQueryLog());
    
  4. Event Debugging Listen to all events in AppServiceProvider:

    DromProducts::product()->listen(function ($event) {
        \Log::debug('Product event:', [$event->name, $event->data]);
    });
    

Extension Points

  1. Custom Product Attributes Extend the product model:

    DromProducts::product()->extend(function ($builder) {
        $builder->addAttribute('warranty_period');
    });
    
  2. Add Validation Rules Override default validation:

    DromProducts::product()->validate(function ($validator) {
        $validator->rule('price', 'min:0');
    });
    
  3. Hook into API Responses Modify Drom API responses:

    DromProducts::api()->extend(function ($response) {
        $response->transformCurrency('USD');
    });
    
  4. Custom Inventory Logic Replace inventory methods:

    DromProducts::inventory()->extend(function ($inventory) {
        $inventory->useBatchTracking();
    });
    

Configuration Quirks

  1. Locale Settings Ensure config/app.php locale matches bundle expectations (e.g., ru_RU):

    'locale' => 'ru_RU',
    
  2. Currency Handling Defaults to RUB; override in config:

    'currency' => 'USD',
    
  3. API Timeout Adjust in config:

    'api' => [
        'timeout' => 30, // seconds
    ],
    
  4. Database Connection Specify a custom connection:

    'database' => [
        'connection' => 'drom_products',
    ],
    

Pro Tips

  • Use Facades Sparingly: Prefer dependency injection for testability.
  • Isolate Bundle Logic: Wrap bundle calls in a service layer to decouple from Laravel.
  • Monitor Dependencies: Set up composer why-not to track `
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.
terminal42/code-quality-tools
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky