Installation
composer require baks-dev/drom-products
Verify php -v is 8.4+ and baks-dev/core (≥7.4) is installed.
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).
Register Service Provider
Add to config/app.php:
BaksDev\DromProducts\DromProductsServiceProvider::class,
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);
Verify Database
Check the products table (or custom schema defined in config) for entries.
$product = DromProducts::product()->updateOrCreate(
['sku' => 'SKU123'],
['name' => 'Updated Name', 'price' => 1500.00]
);
$products = DromProducts::product()->whereIn('id', [1, 2, 3])->update(['status' => 'archived']);
Use the variant() method to manage product variants:
$variant = DromProducts::product()->find(1)->variant()->create([
'sku' => 'VARIANT-SKU',
'attributes' => ['color' => 'red', 'size' => 'M'],
]);
Leverage the inventory() method for batch/serial numbers:
$inventory = DromProducts::inventory()->create([
'product_id' => 1,
'batch_number' => 'BATCH-2024',
'quantity' => 50,
]);
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();
Listen to product events (e.g., ProductCreated):
DromProducts::product()->on('created', function ($product) {
// Send notification or log
});
AppServiceProvider:
public function register()
{
$this->app->singleton(\BaksDev\DromProducts\Services\ProductService::class);
}
doctrine/dbal for shared queries or rewrite models:
class Product extends Model
{
protected $connection = 'drom_products'; // Custom DB connection
}
Route::get('/products', [ProductController::class, 'index']);
class ProductController extends Controller
{
public function index()
{
return response()->json(DromProducts::product()->paginate(10));
}
}
php bin/phpunit --group=drom-products
Mockery to test adapters:
$mockService = Mockery::mock(\BaksDev\DromProducts\Services\ProductService::class);
$this->app->instance(\BaksDev\DromProducts\Services\ProductService::class, $mockService);
Symfony Dependency Injection (DI)
ContainerInterface directly.class LaravelContainerAdapter implements \Psr\Container\ContainerInterface
{
public function get($id)
{
return app($id);
}
}
Doctrine ORM Conflicts
EntityManager from Laravel’s autoloader or use a separate DB connection.Russian-Specific Logic
AppServiceProvider:
DromProducts::product()->extend(function ($builder) {
$builder->validatePriceInRUB();
});
API Rate Limits
$products = Cache::remember('drom_products', 3600, function () {
return DromProducts::api()->fetchProducts();
});
Migration Conflicts
Schema::create('drom_products', function (Blueprint $table) { ... });
Enable Bundle Logging
Add to config/drom-products.php:
'debug' => env('APP_DEBUG', false),
Check logs at storage/logs/drom-products.log.
Symfony Profiler
If using Symfony’s DebugBundle, dump variables:
\Symfony\Component\Debug\Debug::dump($product);
SQL Queries Use Laravel’s query logging:
DB::enableQueryLog();
$products = DromProducts::product()->all();
dd(DB::getQueryLog());
Event Debugging
Listen to all events in AppServiceProvider:
DromProducts::product()->listen(function ($event) {
\Log::debug('Product event:', [$event->name, $event->data]);
});
Custom Product Attributes Extend the product model:
DromProducts::product()->extend(function ($builder) {
$builder->addAttribute('warranty_period');
});
Add Validation Rules Override default validation:
DromProducts::product()->validate(function ($validator) {
$validator->rule('price', 'min:0');
});
Hook into API Responses Modify Drom API responses:
DromProducts::api()->extend(function ($response) {
$response->transformCurrency('USD');
});
Custom Inventory Logic Replace inventory methods:
DromProducts::inventory()->extend(function ($inventory) {
$inventory->useBatchTracking();
});
Locale Settings
Ensure config/app.php locale matches bundle expectations (e.g., ru_RU):
'locale' => 'ru_RU',
Currency Handling
Defaults to RUB; override in config:
'currency' => 'USD',
API Timeout Adjust in config:
'api' => [
'timeout' => 30, // seconds
],
Database Connection Specify a custom connection:
'database' => [
'connection' => 'drom_products',
],
composer why-not to track `How can I help you explore Laravel packages today?